89c51单片机C语言编写的PWM程序
PWM, 单片机, C语言, 程序, 编写
分享到: 新浪微博 QQ空间 开心网 人人网
说明:本程序使用STC89C52RC单片机,22.1184MHz晶振,要使用本程序需要自己修改,我是用来控制直流电机的,外接了L298驱动电路,有问题或意见请回复,谢谢^_^
#include "reg52.H"
#include "MyType.h"
//=============L298端口定义===============
sbit ENA = P3^6;//左轮驱动使能
sbit IN1 = P0^3;//左轮黑线(-)
sbit IN2 = P0^4;//左轮红线(+)
sbit IN3 = P0^5;//右轮红线(-)
sbit IN4 = P0^6;//右轮黑线(+)
sbit ENB = P3^7;//右轮驱动使能
//=============PWM================
#define PWM_COUST 100//PWM细分等份
uchar MOTO_speed1;//左边电机转速
uchar MOTO_speed2; //右边电机转速
uchar PWM_abs1;//左边电机取绝对值后占空比
uchar PWM_abs2;//左边电机取绝对值后占空比
uchar PWM_var1=20;//左边电机直走速度 (不同的电机,此参数不同)
uchar PWM_var2=20;//右边电机直走速度
uchar PWMAnd = 0;//PWM自增变量
/******************************************************************
名称:motor(char speed1,char speed2);
功能:同时调节电机的转速
参数:speed1:电机1的PWM值;speed2:电机2的PWM值
speed>0.正转;speed<0.反转(-100~100)
调用:extern int abs(int val); 取绝对值
返回:
/******************************************************************/
void motor(char speed1,char speed2)
{
//==============左边电机=============
if (speed1>0)
{
IN1 =0;IN2 =1;//正转
}
else if (speed1<0)
{
IN1 =1;IN2 =0;//反转
}
//==============右边电机=============
if (speed2>0)
{
IN3 =1;IN4 =0;//正转
}
else if (speed2<0)
{
IN3 =0;IN4 =1;//反转
}
}
/******************************************************************
名称:motor_PWM();
功能:PWM占空比输出
参数:无
调用:无
返回:无
/******************************************************************/
void motor_PWM ()
{
uchar PWM_abs1;
uchar PWM_abs2;
PWM_abs1=MOTO_speed1;
PWM_abs2=MOTO_speed2;
if (PWM_abs1>PWMAnd) ENA=1; //左边电机占空比输出
else ENA=0;
if (PWM_abs2>PWMAnd) ENB=1; //右边电机占空比输出
else ENB=0;
if (PWMAnd>=PWM_COUST) PWMAnd=0; //PWM计数清零
else PWMAnd+=1;
}
/******************************************************************
名称:void TIME_Init ();
功能:定时器初始化
指令:
调用:无
返回:无
/******************************************************************/
void TIME_Init ()
{
//=========定时器T2初始化 PWM==================
T2CON = 0x00;
T2MOD = 0x00;
RCAP2H = 0xff;//定时0.1ms
RCAP2L = 0x47;
TH2 = 0xff;
TL2 = 0x47;
ET2 = 1;//定时器2中断开
TR2 = 1;//PWM定时器关,PWM周期为10ms
}
/******************************************************************
名称:void PWM_Time2 () interrupt 5
功能:T2中断,PWM控制
参数:
调用:motor_PWM();//PWM占空比输出
返回:
/******************************************************************/
void PWM_Time2 () interrupt 5
{
TR2 = 0;
TF2 = 0;
ET2 = 0;//定时器0中断禁止
motor_PWM();//PWM占空比输出
ET2 = 1;//定时中断0开启
TR2 = 1;
}
main()
{
TIME_Init ();
motor(50,50);//左右电机的转速都是50
}
展开阅读全文