单片机开环PWM的c语言程序,89c51单片机C语言编写的PWM程序.doc

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

}

展开阅读全文

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值