1、綜述
ESM335X具有4路PWM輸出,其中PWM1和PWM2除了可以用于產(chǎn)生標(biāo)準(zhǔn)的PWM信號,現(xiàn)已支持輸出脈沖計數(shù)功能,可以在應(yīng)用程序中設(shè)置脈沖個數(shù),當(dāng)輸出脈沖個數(shù)達到指定值時,驅(qū)動程序自動停止PWM輸出,由于系統(tǒng)響應(yīng)延遲,使用輸出脈沖計數(shù)功能時最高頻率不應(yīng)超過100KHz。本文將介紹Linux系統(tǒng)下輸出脈沖計數(shù)功能的使用方法。
2、應(yīng)用程序
1、使用PWM輸出功能需要設(shè)置如下結(jié)構(gòu)體:
structpwm_config_info
{
unsignedintfreq;/*in Hz*/
unsignedintduty;/*in %*/
unsignedintpolarity;
unsignedintcount;
};
我們?yōu)榱藢崿F(xiàn)輸出計數(shù)功能更新了此結(jié)構(gòu)體,如果需要使用輸出脈沖計數(shù)功能,用戶需要更新頭文件“em335x_drivers.h”中的此結(jié)構(gòu)體及相應(yīng)的封裝函數(shù)(見下文),我們也提供更改過的頭文件和示例程序,需要的用戶可以和我們聯(lián)系。
●freq用于設(shè)置頻率,單位Hz,設(shè)置為0時停止輸出
●duty用于設(shè)置占空比,單位%
●polarity用于設(shè)置輸出極性(高電平有效或低電平有效),可以取值:
#definePWM_POLARITY_NORMAL(0 << 0) // 高電平有效
#define PWM_POLARITY_INVERTED(1 << 0) // 低電平有效
只有當(dāng)PWM脈沖信號輸出時,其對應(yīng)的IO才會被驅(qū)動為高電平或低電平,其余時間PWM引腳為高阻輸入狀態(tài),由于ESM335x主板上GPIO上拉電阻的作用,在沒有脈沖輸出時,PWM引腳為上拉輸入狀態(tài)(高電平)。如果實際使用時希望PWM平時保持為低電平,則需要在PWM信號上增加反向器或者增加1K歐姆的下拉電阻。
●count用于設(shè)置輸出脈沖個數(shù),count設(shè)置為0時為標(biāo)準(zhǔn)PWM輸出,連續(xù)輸出
2、使用PWM輸出時,首先需要打開對應(yīng)的設(shè)備文件,然后在調(diào)用write()函數(shù)進行參數(shù)設(shè)置,我們對write()函數(shù)進行了進一步封裝:
intPWM_Start(intfd,intfreq,intduty,intcount )
{
intrc;
structpwm_config_infoconf;
conf.freq = freq;
conf.duty = duty;
conf.polarity = POLARITY;
conf.count = count;
rc =write(fd, &conf,sizeof(structpwm_config_info));
returnrc;
}
用戶在應(yīng)用程序中可以直接調(diào)用此函數(shù)使能PWM脈沖輸出功能:
#include "pwm_api.h"
intfd;
intnpwm = 1;
chardevice[32];
unsignedintfreq = 1000;
unsignedintduty = 50;
unsignedintcount = 5;
sprintf( device, "/dev/em335x_pwm%d", npwm );
fd =open(device, O_RDWR);
if( fd < 0)
{
printf("can not open /dev/em335x_pwm%d device file!\n", npwm);
return-1;
}
printf( "Open %s\n", device );
PWM_Start( fd, freq, duty, count );
3、使用脈沖輸出計數(shù)功能后,在PWM輸出時可以調(diào)用read()函數(shù)讀取剩余輸出個數(shù),對于標(biāo)準(zhǔn)的連續(xù)PWM輸出read()函數(shù)沒有意義:
intbuf;
intnread = read ( fd, &buf,sizeof(buf) );
if( nread < 0 )
{
perror( "read" );
exit(-1);
}
if( buf > 0 )
printf( "remaining count = %d\n", buf );
4、使用過程中也可以用write()函數(shù)停止PWM輸出,我們也進行了封裝:
intPWM_Stop(intfd )
{
intrc;
structpwm_config_infoconf;
memset( &conf, 0,sizeof(structpwm_config_info));
rc = write(fd, &conf,sizeof(structpwm_config_info));
returnrc;
}
用戶直接調(diào)用此函數(shù)就可以停止PWM輸出:
PWM_Stop( fd);
使用完之后關(guān)閉設(shè)備文件:
close(fd);
5、我們在驅(qū)動中也實現(xiàn)了對select()函數(shù)的支持,select()函數(shù)只在進行PWM輸出計數(shù)時有意義,熟悉select()函數(shù)的用戶可以在應(yīng)用程序中使用select()函數(shù)等待PWM脈沖計數(shù)輸出完成設(shè)置的個數(shù),然后再進行其他操作,select()函數(shù)可以使用戶不必為了等待PWM脈沖計數(shù)輸出完成而阻塞應(yīng)用程序,同時select()函數(shù)也可以使用戶同時對PWM1和PWM2兩個設(shè)備進行監(jiān)控,在應(yīng)用程序中的使用方法如下:
fd_set fdWrite;
structtimeval aTime;
intret;
while(1)
{
FD_ZERO(&fdWrite);
FD_SET(fd,&fdWrite);
aTime.tv_sec = 2;
aTime.tv_usec = 0;
ret = select ( fd+1, NULL, &fdWrite, NULL, &aTime );
if( ret<0 )
printf( "select, something wrong!\n " );
if( ret>0 )
{
if( FD_ISSET(fd, &fdWrite) )
{
printf ( "pwm out all complete!\n" );
/*PWM輸出已經(jīng)輸出完設(shè)置個數(shù),用戶可以在此進行下一步操作*/
/*write(……) or something else*/
break;
}
}
}
Polarity= PWM_POLARITY_INVERTED(低電平有效), freq=5000, duty=60, count=3 時程序運行結(jié)果如下:
如果需要使用脈沖輸出計數(shù)功能或者有任何疑問請和我們聯(lián)系。
-
Linux
+關(guān)注
關(guān)注
87文章
11509瀏覽量
213748 -
嵌入式主板
+關(guān)注
關(guān)注
7文章
6101瀏覽量
36301
發(fā)布評論請先 登錄
DEKRA德凱成為沙特通信和信息技術(shù)設(shè)備技術(shù)法規(guī)認證機構(gòu)
開疆智能CCLinkIE轉(zhuǎn)ModbusTCP網(wǎng)關(guān)連接脈沖計數(shù)器配置案例

經(jīng)過光耦之后,脈沖計數(shù)功能為什么不能實現(xiàn)?
科普|信創(chuàng)是什么?一文讀懂“信息技術(shù)應(yīng)用創(chuàng)新”戰(zhàn)略

芯盛智能榮獲2024年信息技術(shù)應(yīng)用創(chuàng)新工作委員會卓越貢獻成員單位
飛騰助力首屆教育信息技術(shù)應(yīng)用創(chuàng)新大賽圓滿落幕
有方科技參編的信息技術(shù)團體標(biāo)準(zhǔn)發(fā)布
AM335x和AMIC110 Sitara?處理器技術(shù)參考手冊

中科創(chuàng)達榮獲2024年軟件和信息技術(shù)服務(wù)優(yōu)秀企業(yè)
適用于AM335x TRF7970A的neard(Linux NFC)構(gòu)建說明

具有脈沖計數(shù)接口的 LMT01-Q1 0.5°C 精度雙引腳數(shù)字輸出溫度傳感器數(shù)據(jù)表

具有脈沖計數(shù)接口的 LMT01 0.5°C 精度雙引腳數(shù)字輸出溫度傳感器數(shù)據(jù)表

評論