在工業(yè)控制中,許多場(chǎng)合都可以看到電機(jī)的身影。特別是步進(jìn)電機(jī),以其精度高,運(yùn)行可靠等優(yōu)勢(shì),廣泛地應(yīng)用于數(shù)字控制系統(tǒng)中。像這一類步進(jìn)電機(jī)的控制,通常都是使用的脈沖信號(hào)來(lái)實(shí)現(xiàn)的。當(dāng)步進(jìn)電機(jī)接收到一個(gè)脈沖信號(hào),會(huì)轉(zhuǎn)動(dòng)一個(gè)固定的角度,所以可以通過(guò)控制脈沖的個(gè)數(shù)來(lái)控制轉(zhuǎn)動(dòng)的角度,從而實(shí)現(xiàn)精確定位的目的;同時(shí)可以通過(guò)控制脈沖頻率來(lái)控制電機(jī)轉(zhuǎn)動(dòng)的速度,從而實(shí)現(xiàn)控制速度的目的。
英創(chuàng)嵌入式工控板提供了兩種控制步進(jìn)電機(jī)的方法給用戶,第一種方法是使用GPIO發(fā)出脈沖來(lái)實(shí)現(xiàn)控制電機(jī)的目的,根據(jù)需要轉(zhuǎn)動(dòng)的角度和速度,通過(guò)調(diào)用GPIO的API函數(shù)來(lái)發(fā)出相應(yīng)個(gè)數(shù)和頻率的脈沖就能夠達(dá)到這一目的。但是如果控制電機(jī)的實(shí)時(shí)性要求比較高,需要達(dá)到10ms以內(nèi)的精度,那么第一種方法可能就不能滿足要求了,因?yàn)榭刂艷PIO是通過(guò)了操作系統(tǒng)來(lái)執(zhí)行的,這樣程序就涉及到了系統(tǒng)調(diào)度等因素,在實(shí)時(shí)性方面肯定就不能滿足太高的需求。于是英創(chuàng)公司推出了另外一種實(shí)時(shí)性較高的方法,即使用PWM脈沖來(lái)控制電機(jī)。
英創(chuàng)工控主板EM928x系列上共有4路PWM輸出,其最高輸出頻率可達(dá)12MHz,但如果希望保證一定精 度的占空比(1%的精度),則輸出最高頻率只能到240KHz。而EM335x系列上也有4路PWM輸出,其最高輸出頻率可達(dá)50MHz,但如果希望保證一定精度的占空比(1% 的精度),則輸出最高頻率只能到1MHz。從頻率和占空比上看,應(yīng)該是完全滿足控制速度的要求,但是如果要實(shí)現(xiàn)精確定位的功能,還需要控制脈沖的個(gè)數(shù),所以英創(chuàng)公司修改了PWM脈沖驅(qū)動(dòng),在原來(lái)的基礎(chǔ)上增加了對(duì)PWM波個(gè)數(shù)控制和計(jì)數(shù)的功能,使應(yīng)用程序能控制發(fā)出的脈沖個(gè)數(shù),從而精確步進(jìn)電機(jī)的動(dòng)作。
本文以下部分將介紹這一新增加的功能以及在應(yīng)用程序中的調(diào)用方法。
實(shí)現(xiàn)這一功能是通過(guò)利用CPU內(nèi)部的計(jì)數(shù)器來(lái)記錄PWM脈沖的個(gè)數(shù),當(dāng)達(dá)到預(yù)定的值,就產(chǎn)生中斷將PWM脈沖停止,這樣就能夠?qū)WM脈沖的計(jì)數(shù)并且產(chǎn)生指定個(gè)數(shù)的脈沖,這一部分的功能英創(chuàng)公司已經(jīng)在驅(qū)動(dòng)中完成,用戶只需要在應(yīng)用程序中通過(guò)接口調(diào)用,就可以啟用、停止計(jì)數(shù)功能,并且實(shí)時(shí)查詢脈沖數(shù)。支持這一功能的PWM波有兩路:PWM1和PWM2,能產(chǎn)生的最小波形數(shù)為2。對(duì)PWM的操作可歸為2種基本操,在原有的普通使能和停止功能基礎(chǔ)上加入了計(jì)數(shù)功能的操作,所對(duì)應(yīng)的命令參數(shù),定義如下:
#define EM9280_COUNT_START 12//啟動(dòng)帶計(jì)數(shù)功能的PWM脈沖輸出
#define EM9280_COUNT_STOP 13//強(qiáng)制停止帶計(jì)數(shù)功能的PWM脈沖輸出
接下來(lái)來(lái)看頭文件中定義的PWM 的數(shù)據(jù)結(jié)構(gòu),包括頻率、占空比以及極性等參數(shù):
struct pwm_config_info
{
unsigned int cmd;//= 0, 1, 2, ....
unsigned int freq;/* in Hz */
unsigned int duty;/* in % */
unsigned int polarity;
unsigned int count;
};
cmd表示指令:就是上面說(shuō)的兩種操作。
freq表示輸出的脈沖頻率,單位為 Hz。Freq 的取值范圍 和板卡的最高支持頻率有關(guān)。
duty表示輸出脈沖的占空比,單位為%。
Duty的取值范圍:1 – 99。
Polarity表示輸出脈沖的極性,選擇 0 或者 1。
count是新加入的參數(shù),表示需要生成的PWM波的個(gè)數(shù)。
進(jìn)行PWM操作時(shí),首先打開相應(yīng)的設(shè)備節(jié)點(diǎn)文件,然后再調(diào)用 write( )函數(shù)進(jìn)行 pwm 的設(shè)置、啟動(dòng)計(jì)數(shù)等操作,以下為啟動(dòng)計(jì)數(shù)功能的相關(guān)應(yīng)用代碼:
int PWM_COUNT_Start(int fd, int freq, int duty, unsigned int count)
{
int rc;
struct pwm_config_info conf;
conf.cmd = EM9280_COUNT_START;
conf.freq = freq;
conf.duty = duty;
conf.polarity = POLARITY;
conf.count = count;
rc = write(fd, &conf, sizeof(struct pwm_config_info));
return rc;
}
這樣就只需要調(diào)用PWM_COUNT_Start()這個(gè)函數(shù),并將參數(shù)帶入即可,我們就以產(chǎn)生5個(gè)占空比為1KHZ的波形為例:
int npwm = 1;
int fd;
char device[32];
unsigned int freq = 1000;
unsigned int duty = 50;
unsigned int count = 5;
sprintf( device, '/dev/em9280_pwm%d', npwm );
fd = open(device, O_RDWR);
if ( fd < 0)
{
printf('can not open /dev/em9280_pwm%d device file!\n', npwm);
return -1;
}
printf( 'Open %s\n', device );
PWM_COUNT_Start( fd, freq, duty, count );
在脈沖輸出的過(guò)程中,可以調(diào)用read函數(shù)讀取已經(jīng)輸出的脈沖數(shù),如果到達(dá)某一個(gè)值的時(shí)候需要停止輸出,就調(diào)用write( )函數(shù)進(jìn)行pwm的停止,詳細(xì)的代碼如下:
int PWM_COUNT_Stop(int fd )
{
int rc;
struct pwm_config_info conf;
memset( &conf, 0, sizeof(struct pwm_config_info));
conf.cmd = EM9280_COUNT_STOP;
rc = write(fd, &conf, sizeof(struct pwm_config_info));
return rc;
}
//讀取已發(fā)送脈沖數(shù)
read(fd, &buf, sizeof(buf));
if( buf>=5 )//當(dāng)輸出脈沖數(shù)到達(dá)某個(gè)值則停止
PWM_COUNT_Stop( fd );
生成5個(gè)占空比為1KHz的波形的程序運(yùn)行的結(jié)果如下圖:
通過(guò)對(duì)PWM脈沖計(jì)數(shù)功能的實(shí)現(xiàn),就可以對(duì)電機(jī)進(jìn)行精確的控制了,詳細(xì)的代碼請(qǐng)參考光盤中的例程。
-
嵌入式主板
+關(guān)注
關(guān)注
7文章
6097瀏覽量
36140
發(fā)布評(píng)論請(qǐng)先 登錄
信創(chuàng)浪潮下,國(guó)產(chǎn)主板有什么新的發(fā)展機(jī)遇?

評(píng)論