工控網(wǎng)首頁
>

應(yīng)用設(shè)計(jì)

>

ESM335x輸出脈沖計(jì)數(shù)

ESM335x輸出脈沖計(jì)數(shù)

ESM335x的PWM1和PWM2除了可用于產(chǎn)生標(biāo)準(zhǔn)的PWM信號(hào)外還支持輸出脈沖計(jì)數(shù)功能,輸出脈沖計(jì)數(shù)的工作原理是驅(qū)動(dòng)程序每輸出一個(gè)PWM波就產(chǎn)生一個(gè)中斷并計(jì)數(shù),當(dāng)計(jì)數(shù)達(dá)到用戶設(shè)定的脈沖個(gè)數(shù)后,驅(qū)動(dòng)程序自動(dòng)停止PWM輸出,由于系統(tǒng)響應(yīng)中斷有一定的延時(shí),所以驅(qū)動(dòng)程序?qū)敵雒}沖的最高頻率限制在5KHz。

應(yīng)用程序通過打開PWM設(shè)備("PWM1:"或"PWM2:")使用脈沖計(jì)數(shù)功能,下面是示例代碼:

  #include "stdafx.h"

  #include "bsp_drivers.h"

  int _tmain(int argc, _TCHAR* argv[])

  {

    HANDLEhPWM;

    PWM_INFO     pwm_info;

    DWORDdwBytes;

    BOOL     bRc;

    hPWM = CreateFile( TEXT("PWM1:"),

      GENERIC_READ|GENERIC_WRITE,

      FILE_SHARE_READ|FILE_SHARE_WRITE,

      NULL,

      OPEN_EXISTING,

      FILE_FLAG_RANDOM_ACCESS,

      NULL);

    pwm_info.dwNum = 0; // PWM輸出模式

    pwm_info.dwFreq = 100000; // 頻率范圍1Hz~50MHz

    pwm_info.dwDuty = 500; // 占空比50%, 單位0.1%

    pwm_info.dwPol = 1; // 極性

    bRc = WriteFile( hPWM, &pwm_info, sizeof( PWM_INFO), &dwBytes, NULL );

    pwm_info.dwFreq = 0; // 頻率參數(shù)為0,停止PWM輸出

    bRc = WriteFile( hPWM, &pwm_info, sizeof( PWM_INFO), &dwBytes, NULL );

    pwm_info.dwNum = 3; // PWM脈沖計(jì)數(shù)輸出模式

    pwm_info.dwFreq = 5000; // 頻率范圍1Hz~5KHz

    pwm_info.dwDuty = 500; // 占空比50%, 單位0.1%

    pwm_info.dwPol = 1; // 極性,無輸出時(shí)IO保持為高電平

    // 脈沖輸出完成或超時(shí)后WriteFile函數(shù)返回, dwBytes返回實(shí)際輸出的脈沖個(gè)數(shù)

    bRc = WriteFile( hPWM, &pwm_info, sizeof( PWM_INFO), &dwBytes, NULL );

    CloseHandle( hPWM );

    return 0;

  }

  上面代碼中的pwm_info用于設(shè)置PWM參數(shù),其定義如下:

  typedef struct

  {

    /* PWM頻率,單位:Hz,PWM模式輸出頻率范圍1Hz~50MHz,脈沖計(jì)數(shù)模式頻率范圍1Hz~5KHz

      = 0: 停止PWM輸出 */

    DWORDdwFreq;

    DWORDdwDuty; /* 占空比, 單位:0.1%, 范圍:0 - 1000 */

    DWORD    dwPol; /* PWM極性, =0:高電平有效, =1:低電平有效 */

    DWORDdwNum; /* 輸出脈沖個(gè)數(shù), =0:連續(xù)的PWM輸出 */

  } PWM_INFO, *PPWM_INFO;

當(dāng)參數(shù)設(shè)置dwFreq=5000, dwDuty=500, dwPol=1, dwNum=3時(shí),輸出的波形如下:

只有當(dāng)PWM脈沖信號(hào)輸出時(shí),其對(duì)應(yīng)的IO才會(huì)被驅(qū)動(dòng)為高電平或低電平,其余時(shí)間PWM引腳為高阻輸入狀態(tài),由于ESM335x主板上GPIO上拉電阻的作用,在沒有脈沖輸出時(shí),PWM引腳為上拉輸入狀態(tài)(高電平)。如果實(shí)際使用,時(shí)希望PWM平時(shí)保持為低電平,則需要在PWM信號(hào)上增加反向器,比如增加一級(jí)非門。

在PWM引腳上增加1K歐的下拉電阻,同時(shí)將設(shè)置dwPol=0,也可以保證PWM引腳在沒有輸出時(shí)保持為低電平,下圖是在PWM引腳上增加了下拉電阻,同時(shí)參數(shù)設(shè)置為dwFreq=5000, dwDuty=500, dwPol=0, dwNum=3時(shí)輸出的波形:

利用反向電路或增加下拉電阻,這兩種方法都可以保證PWM信號(hào)在ESM335x上電啟動(dòng)過程中和沒有脈沖輸出時(shí)保持為低電平。

PWM脈沖通常用來控制步進(jìn)電機(jī),脈沖頻率決定電機(jī)轉(zhuǎn)速,脈沖個(gè)數(shù)控制電機(jī)的角位移。步進(jìn)電機(jī)在啟動(dòng)過程中,需要控制脈沖從一個(gè)較低的頻率逐漸增加到電機(jī)正常工作時(shí)的頻率,電機(jī)在停止時(shí)也有一個(gè)相應(yīng)的減速過程。在使用ESM335x的PWM驅(qū)動(dòng)步進(jìn)電機(jī)時(shí),可以多次調(diào)用WriteFile函數(shù),然后每次修改PWM脈沖頻率來實(shí)現(xiàn)步進(jìn)電機(jī)的加速和減速過程。需要注意的是在即便應(yīng)用程序連續(xù)不斷的調(diào)用WriteFile函數(shù),在每次調(diào)用之間都會(huì)有幾十到幾百微秒不等的延時(shí)。

投訴建議

提交

查看更多評(píng)論
其他資訊

查看更多

Windows下STM32單片機(jī)eclipse編譯環(huán)境搭建

Android Studio應(yīng)用開發(fā)簡(jiǎn)介

WinCE工控主板WiFi解決方案

敬請(qǐng)關(guān)注成都英創(chuàng)微信公眾號(hào)

WinCE工控主板通過PPI協(xié)議連接西門子PLC