|
倆路pwm調(diào)速循跡小車
單片機源程序如下:
- /********** 循跡程序 ************************/
- // P0.0和P0.1-----右電機
- // P0.2和P0.3-----左電機
- // P1.0-----------右1光電管
- // P1.1-----------左1光電管
- /*****************************************************/
- #include<reg52.h>//包含必要頭文件
- #define uchar unsigned char
- #define uint unsigned int
- void Init_Timer0(void);//定時器初始化
- sbit P10=P1^0; //定義單片機控制左邊電機的引腳
- sbit P11=P1^1; //定義單片機控制左邊電機的引腳
- sbit P12=P1^2; //定義單片機控制右邊電機的引腳
- sbit P13=P1^3; //定義單片機控制右邊電機的引腳
- sbit ENA=P3^0;
- sbit ENB=P3^1;
- #define Right_moto_pwm P3^0 //接驅(qū)動模塊ENA使能端輸入PWM信號調(diào)節(jié)速度
- #define Left_moto_pwm P3^1 //接驅(qū)動模塊ENB使能端輸入PWM信號調(diào)節(jié)速度
- #define Left_moto_back {P10=0,P11=1;} //左電機后退
- #define Left_moto_go {P10=1,P11=0;} //左電機前進
- #define Left_moto_stop {P10=1,P11=1;} //左電機停轉(zhuǎn)
- #define Right_moto_back {P12=0,P13=1;} //右電機后退
- #define Right_moto_go {P12=1,P13=0;} //右電機前轉(zhuǎn)
- #define Right_moto_stop {P12=1,P13=1;} //右電機停轉(zhuǎn)
- sbit y1=P2^0; //定義單片機連接循跡板右邊第一個光電管的引腳
- sbit z1=P2^1; //定義單片機連接循跡板左邊第一個光電管的引腳
- int pwm_val_left =0;
- int push_val_left =0; //左電機占空比N/10
- int pwm_val_right =0;
- int push_val_right=0; //右電機占空比N/10
- bit Right_moto_stp=1;
- bit Left_moto_stp =1;
- void delay(int z) //pwm中使用的延時函數(shù)
- {
- int i,j;
- for(i=2;i>0;i--)
- for(j=z;j>0;j--);
- }
- void qian() //左右輪協(xié)同前進子函數(shù)
- {
- push_val_left =7.5; //PWM 調(diào)節(jié)參數(shù)1-20 1為最慢20是最快 改這個值可以改變其速度
- push_val_right =7; //PWM 調(diào)節(jié)參數(shù)1-20 1為最慢20是最快 改這個值可以改變其速度
- Left_moto_go ; //左電機前進
- Right_moto_go ; //右電機前進
- }
- void you() //左右輪協(xié)同 右轉(zhuǎn)子函數(shù)
- {
- push_val_left =7; //PWM 調(diào)節(jié)參數(shù)1-20 1為最慢20是最快 改這個值可以改變其速度
- push_val_right =7; //PWM 調(diào)節(jié)參數(shù)1-20 1為最慢20是最快 改這個值可以改變其速度
- Left_moto_go ; //左電機前進
- Right_moto_back ; //右電機前進
- }
- void zuo() //左右輪協(xié)同 左轉(zhuǎn)子函數(shù)
- {
- push_val_left =7; //PWM 調(diào)節(jié)參數(shù)1-20 1為最慢20是最快 改這個值可以改變其速度
- push_val_right =7; //PWM 調(diào)節(jié)參數(shù)1-20 1為最慢20是最快 改這個值可以改變其速度
- Left_moto_back ; //左電機前進
- Right_moto_go ; //右電機前進
- }
- void ting() //左右輪都停止轉(zhuǎn)動
- {
- Right_moto_stop; //右電機停走
- Left_moto_stop; //左電機停走
- }
- void pwm_out_left_moto(void) //左電機調(diào)速,調(diào)節(jié)push_val_left的值改變電機轉(zhuǎn)速,占空比
- {
- if(Left_moto_stp)
- {
- {
- if(pwm_val_left<=push_val_left)
- {
- ENB=1;
- }
- else
- {
- ENB=0;
- }
- }
- {
- if(pwm_val_left>=20)
- {
- pwm_val_left=0;
- }
- }
- }
- else
- {
- ENB=0;
- }
- }
- void pwm_out_right_moto(void) //右電機調(diào)速,調(diào)節(jié)push_val_left的值改變電機轉(zhuǎn)速,占空比
- {
- if(Right_moto_stp)
- {
- if(pwm_val_right<=push_val_right)
- {
- ENA=1;
- }
- else
- {
- ENA=0;
- }
- if(pwm_val_right>=20)
- {
- pwm_val_right=0;
- }
- }
- else
- {
- ENA=0;
- }
- }
- void main() //主函數(shù)
- {
- TMOD |=0X01;
- TH0= 0XFC; //2ms定時
- TL0= 0X30;
- TR0= 1;
- ET0= 1;
- EA = 1;
- z1=1;
- y1=1;
- while(1) //單片機不間斷監(jiān)測 (是個死循環(huán))
- {
- qian(); //調(diào)用前進函數(shù),使小車光電管不滿足以下幾個條件時都處于前進狀態(tài)
- while(y1==1&z1==0)
- {
- you(); //
- //zuo();
- }
- while(y1==0&z1==1)
- {
- zuo(); //
- //you();
- }
- while(y1==1&z1==1)
- {
- ting(); // 停止
- }
- while(y1==0&z1==0) //判斷當(dāng)左邊和右光電管都遇到黑線時
- {
- qian(); //調(diào)用前進函數(shù)
- }
- }
- }
- void Init_Timer0()interrupt 1 using 2
- {
-
- TH0=0XFC; //2Ms定時
- TL0=0X30;
-
- pwm_val_left++;
- pwm_val_right++;
- pwm_out_left_moto();
- pwm_out_right_moto();
- }
復(fù)制代碼
所有資料51hei提供下載:
pwm調(diào)速正常慢速1.zip
(23.5 KB, 下載次數(shù): 15)
2019-5-31 09:37 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|
|