今天嘗試了小車里面的直流電機部分,嘗試了用pwm控制的變速轉動及用改變IO口電平的正反轉。
在控制變速轉動中,拿之前的呼吸燈來做成功了。main.c中主函數如下:
int main(void)
{
u16 led0pwmval=0;
u8 dir=1;
delay_init(); //延時函數初始化
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);
}
}
經過相應的定義和初始化之后,TIM1_PWM_Init(899,0);按我的理解通俗來說這句話可以控制一個循環周期的時長。“899”代表了arr的值,會決定周期時長;而“0”即psc的值會決定是否時鐘預分頻。
led0pwmval的值即直接控制了PWM的占空比。另外在這個實驗中在配置 AFIO 相關寄存器的時候,必須先開啟輔助功能時鐘。 (之前兩天的當中有什么情況需要用的IO的復位(AFIO))。
在while循環里面,先消抖,而后led0pwmval 即PWM 比較值,通過他的改變控制PWM的占空比。在每一個循環中,因為led0pwmval值的不同,燈的亮度會發生改變,同樣的電機的轉速也會發生改變。
另外在改變PWM的占空比的時候,改變值“300”,會發現當改變值超過300后,燈的亮度的改變將看不出來,只有時間的變化。是燈的原因與程序無關。
在直流電機的正反轉當中,開始直接想的是在上一個轉速上面直接改變IO口電平的狀態來改變電機兩個引腳的高低,達到正反轉的目的,結果沒能實現。具體原因還不知道。
然后單獨嘗試直流電機的正反轉,即通過配置高低電平來實現控制電機的正反轉。具體程序參照“https://blog.csdn.net/teavamc/article/details/77429519 ”
自己在開始寫這個的時候遇到的問題是不知道怎么來表示,原理很簡單,
#define IN1(a) if (a) \ GPIO_SetBits(GPIOA,GPIO_Pin_2);\else \ GPIO_ResetBits(GPIOA,GPIO_Pin_2) 但像這樣的宏定義自己之前沒有想到,在這句話中要注意:1,這句話最后不需要;來結尾;2,\代表的是連接前后兩句話。
---------------------
作者:天甄
來源:CSDN
|