找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2028|回复: 2
打印 上一主题 下一主题
收起左侧

pwm波调速程序

[复制链接]
跳转到指定楼层
楼主
ID:221980 发表于 2017-7-26 17:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
程序如下:
/*晶振: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--);
}  

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:178382 发表于 2017-7-26 20:55 | 只看该作者
学习了,谢谢分享
回复

使用道具 举报

板凳
ID:130345 发表于 2017-8-5 14:12 | 只看该作者
挺好用的,拿小车来试试
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表