标题:
俩路pwm调速循迹小车 单片机源程序
[打印本页]
作者:
132455
时间:
2019-5-31 09:40
标题:
俩路pwm调速循迹小车 单片机源程序
俩路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)
2019-5-31 09:37 上传
点击文件名下载附件
下载积分: 黑币 -5
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1