俩路pwm调速循迹小车
单片机源程序如下:
- /********** 循迹程序 ************************/
- // 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 //接驱动模块ENA使能端输入PWM信号调节速度
- #define Left_moto_pwm P3^1 //接驱动模块ENB使能端输入PWM信号调节速度
- #define Left_moto_back {P10=0,P11=1;} //左电机后退
- #define Left_moto_go {P10=1,P11=0;} //左电机前进
- #define Left_moto_stop {P10=1,P11=1;} //左电机停转
- #define Right_moto_back {P12=0,P13=1;} //右电机后退
- #define Right_moto_go {P12=1,P13=0;} //右电机前转
- #define Right_moto_stop {P12=1,P13=1;} //右电机停转
- 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中使用的延时函数
- {
- int i,j;
- for(i=2;i>0;i--)
- for(j=z;j>0;j--);
- }
- void qian() //左右轮协同前进子函数
- {
- push_val_left =7.5; //PWM 调节参数1-20 1为最慢20是最快 改这个值可以改变其速度
- push_val_right =7; //PWM 调节参数1-20 1为最慢20是最快 改这个值可以改变其速度
- Left_moto_go ; //左电机前进
- Right_moto_go ; //右电机前进
- }
- void you() //左右轮协同 右转子函数
- {
- push_val_left =7; //PWM 调节参数1-20 1为最慢20是最快 改这个值可以改变其速度
- push_val_right =7; //PWM 调节参数1-20 1为最慢20是最快 改这个值可以改变其速度
- Left_moto_go ; //左电机前进
- Right_moto_back ; //右电机前进
- }
- void zuo() //左右轮协同 左转子函数
- {
- push_val_left =7; //PWM 调节参数1-20 1为最慢20是最快 改这个值可以改变其速度
- push_val_right =7; //PWM 调节参数1-20 1为最慢20是最快 改这个值可以改变其速度
- Left_moto_back ; //左电机前进
- Right_moto_go ; //右电机前进
- }
- void ting() //左右轮都停止转动
- {
- Right_moto_stop; //右电机停走
- Left_moto_stop; //左电机停走
- }
- void pwm_out_left_moto(void) //左电机调速,调节push_val_left的值改变电机转速,占空比
- {
- 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) //右电机调速,调节push_val_left的值改变电机转速,占空比
- {
- 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() //主函数
- {
- TMOD |=0X01;
- TH0= 0XFC; //2ms定时
- TL0= 0X30;
- TR0= 1;
- ET0= 1;
- EA = 1;
- z1=1;
- y1=1;
- while(1) //单片机不间断监测 (是个死循环)
- {
- qian(); //调用前进函数,使小车光电管不满足以下几个条件时都处于前进状态
- 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) //判断当左边和右光电管都遇到黑线时
- {
- qian(); //调用前进函数
- }
- }
- }
- 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();
- }
复制代码
所有资料51hei提供下载:
pwm调速正常慢速1.zip
(23.5 KB, 下载次数: 15)
|