标题: pwm波调速程序 [打印本页]

作者: 呀呀兜兜    时间: 2017-7-26 17:01
标题: pwm波调速程序
程序如下:
/*晶振:11.0592,输出的PWM直接给L298N以驱动电机,
通过调节(percent_l=90;)等号后的数值,与(Sum100)的比值,
为占空比,如上取90比100则输出PWM波占空比为9/10的高电平,
1/10的低电平,低电平时间越长则速度越慢。
要注意的是调节#define Sum100的值可以调节PWM的总周期,
调节#define tim?200的值可以调节定时器的定时周期。*/
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
#define MOTOR_C P1    //P1口作为电机的控制口。
#define BACK 0xfa     //后退,0b1111 1010
#define FORWARD 0xf5  //前进,0b1111 0101
#define Sum 100       //总周期,为100倍的定时器时间大约27ms
#define tim 200       //初值数200约270us
sbit PWM_L=P1^0;      //左电机前进
sbit PWM_R=P1^2;      //右电机前进
sbit PWM_HL=P1^1;     //左电机后退
sbit PWM_HR=P1^3;     //右电机后退
void timer0_init(void);//定时器0初始化函数。
void timer1_init(void);//定时器1初始化函数。
void right(void);     //前进右转弯函数。
void left(void);      //前进左转弯函数。
void forward(void);   //前进函数。
void stop(void);      //停止
void Delayms();       //延时1ms
void Delay100ms(unsigned int d);//延时100ms
uchar percent_l=0;    //(前进)左轮占空比。
uchar percent_r=0;    //(前进)右轮占空比。
uchar percent_hl=0;   //(后退)左轮占空比。
uchar percent_hr=0;   //(后退)右轮占空比。
uchar run_time=0;     //车轮运行一步的时间。
void main(void)
{
timer0_init();
timer1_init();
MOTOR_C=0x00;
//ENA=1;
//ENB=1;
while(1)
{
left();
Delay100ms(0.9);
right();
Delay100ms(0.9);
//back();
Delay100ms(0.9);
forward();
Delay100ms(0.9);
//stop();
}
}
void timer0_init(void)
{
TMOD=0X11;
TH0=(65536-tim)/256;
TL0=(65536-tim)%256;
EA=1;//开总中断。                                                         0000
ET0=1;//开定时器0中断。
TR0=1;//启动定时器0。
}

void timer1_init(void)
{
TH1=(65536-tim)/256;
TL1=(65536-tim)%256;
ET1=1;
TR1=1;
}
/**************前进方向****/
void right(void)
{
percent_l=50;//左轮速度快,最好去50以上  
percent_r=0;//右轮速度慢。
percent_hl=0;
percent_hr=0;
}
void left(void)
{
percent_l=0;//左轮速度慢。
percent_r=50;//右轮速度快。
percent_hl=0;
percent_hr=0;
}

void forward(void)
{
percent_l=70;//左轮同速度。
percent_r=70;//右轮同速度。
percent_hl=0;
percent_hr=0;
}
void stop(void)
{
percent_l=0;//左轮零速度。
percent_r=0;//右轮零速度。
percent_hl=0;
percent_hr=0;
}

/**************中断服务*******************/
void timer_0(void) interrupt 1 using 1
{
static uchar temp=0;//中断次数计数。
TR0=0;
if(temp<Sum)
{           //关总中断,屏蔽其他中断。
if(temp<percent_l)
{
PWM_L=1;    //左电机高电平。
}
else
{
PWM_L=0;    //左电机低电平。
}
if(temp<percent_r)
{
PWM_R=1;   //右电机高电平。
}
else
{
PWM_R=0;   //右电机低电平。
}
}
else
{temp=0;}
temp++;
TH0=(65536-tim)/256;
TL0=(65536-tim)%256;  //实现计数。
TR0=1;   //开总中断。
}  
void timer1 ( void ) interrupt 3 using 2
{   
static uchar temp1=0;
TR1=0;   //关总中断,屏蔽其他中断。
if(temp1<Sum)
{
if(temp1<percent_hl)
{
PWM_HL=1;//左电机高电平。
}
else
{
PWM_HL=0;//左电机低电平。
}
if(temp1<percent_hr)
{
PWM_HR= 1;//右电机高电平。
}
else
{
PWM_HR= 0;//右电机低电平。
}
}
else
{
temp1=0;
}
temp1++;
TH1=(65536-tim)/256;
TL1=(65536-tim)%256;   //实现计数。
TR1 = 1;  //开总中断。
}
void Delayms(void)
{
unsigned char a,b,c;
for(c=1;c>0;c--)
for(b=23;b>0;b--)
for(a=13;a>0;a--);
}  
void Delay100ms(unsigned int d)
{
unsigned int a,b,c;
for(c=d;c>0;c--)
for(b=60;b>0;b--)
for(a=130;a>0;a--);
}  


作者: yeguo99    时间: 2017-7-26 20:55
学习了,谢谢分享
作者: 持勤补拙    时间: 2017-8-5 14:12
挺好用的,拿小车来试试




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1