|
今天嘗試了小車(chē)?yán)锩娴闹绷麟姍C(jī)部分,嘗試了用pwm控制的變速轉(zhuǎn)動(dòng)及用改變IO口電平的正反轉(zhuǎn)。
在控制變速轉(zhuǎn)動(dòng)中,拿之前的呼吸燈來(lái)做成功了。main.c中主函數(shù)如下:
int main(void)
{
u16 led0pwmval=0;
u8 dir=1;
delay_init(); //延時(shí)函數(shù)初始化
LED_Init(); //初始化與LED連接的硬件接口
TIM1_PWM_Init(899,0);//不分頻。PWM頻率=72000/(899+1)=80Khz
while(1)
{
delay_ms(10);
if(dir)led0pwmval++;
else led0pwmval–;
if(led0pwmval>300)dir=0;
if(led0pwmval==0)dir=1;
TIM_SetCompare1(TIM1,led0pwmval);
}
}
經(jīng)過(guò)相應(yīng)的定義和初始化之后,TIM1_PWM_Init(899,0);按我的理解通俗來(lái)說(shuō)這句話(huà)可以控制一個(gè)循環(huán)周期的時(shí)長(zhǎng)!899”代表了arr的值,會(huì)決定周期時(shí)長(zhǎng);而“0”即psc的值會(huì)決定是否時(shí)鐘預(yù)分頻。
led0pwmval的值即直接控制了PWM的占空比。另外在這個(gè)實(shí)驗(yàn)中在配置 AFIO 相關(guān)寄存器的時(shí)候,必須先開(kāi)啟輔助功能時(shí)鐘。 (之前兩天的當(dāng)中有什么情況需要用的IO的復(fù)位(AFIO))。
在while循環(huán)里面,先消抖,而后led0pwmval 即PWM 比較值,通過(guò)他的改變控制PWM的占空比。在每一個(gè)循環(huán)中,因?yàn)閘ed0pwmval值的不同,燈的亮度會(huì)發(fā)生改變,同樣的電機(jī)的轉(zhuǎn)速也會(huì)發(fā)生改變。
另外在改變PWM的占空比的時(shí)候,改變值“300”,會(huì)發(fā)現(xiàn)當(dāng)改變值超過(guò)300后,燈的亮度的改變將看不出來(lái),只有時(shí)間的變化。是燈的原因與程序無(wú)關(guān)。
在直流電機(jī)的正反轉(zhuǎn)當(dāng)中,開(kāi)始直接想的是在上一個(gè)轉(zhuǎn)速上面直接改變IO口電平的狀態(tài)來(lái)改變電機(jī)兩個(gè)引腳的高低,達(dá)到正反轉(zhuǎn)的目的,結(jié)果沒(méi)能實(shí)現(xiàn)。具體原因還不知道。
然后單獨(dú)嘗試直流電機(jī)的正反轉(zhuǎn),即通過(guò)配置高低電平來(lái)實(shí)現(xiàn)控制電機(jī)的正反轉(zhuǎn)。具體程序參照“https://blog.csdn.net/teavamc/article/details/77429519 ”
自己在開(kāi)始寫(xiě)這個(gè)的時(shí)候遇到的問(wèn)題是不知道怎么來(lái)表示,原理很簡(jiǎn)單,
#define IN1(a) if (a) \ GPIO_SetBits(GPIOA,GPIO_Pin_2);\else \ GPIO_ResetBits(GPIOA,GPIO_Pin_2) 但像這樣的宏定義自己之前沒(méi)有想到,在這句話(huà)中要注意:1,這句話(huà)最后不需要;來(lái)結(jié)尾;2,\代表的是連接前后兩句話(huà)。
---------------------
作者:天甄
來(lái)源:CSDN
|
評(píng)分
-
查看全部評(píng)分
|