51单片机PWM信号的产生与应用

本文最后更新于:2022年5月29日 上午

定时器中断可以用于产生PWM信号,可以通过如下方式得到。

1、首先用之前不能忘了宏定义以下相应变量:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//定义小车驱动模块输入IO口
sbit IN1=P1^2;
sbit IN2=P1^3;
sbit IN3=P1^6;
sbit IN4=P1^7;
sbit ENA=P1^4;
sbit ENB=P1^5;
unsigned char pwm_val_left =0;//变量定义
unsigned char pwm_val_right =0;
unsigned char push_val_left =4;// 左电机占空比N/20 //速度调节变量 0-20。。。0最小,20最大
unsigned char push_val_right=4;// 右电机占空比N/20

sbit Right_PWM_ON=1; //右电机PWM开关
sbit Left_PWM_ON =1; //左电机PWM开关

unsigned int time=0;//用于存放定时器时间值


2、产生PWM函数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
 
/* PWM调制电机转速 */
/************************************************************************/
// 左电机调速
/*调节push_val_left的值改变电机转速,占空比*/
void pwm_out_left_moto(void)
{
if(Left_PWM_ON)
{
if(pwm_val_left<=push_val_left)
{
ENA=1;
}
else
{
ENA=0;
}
if(pwm_val_left>=20)
pwm_val_left=0;
}
else
{
ENA=0; //若未开启PWM则EN1=0 左电机 停止
}
}

/******************************************************************/
/* 右电机调速 */
void pwm_out_right_moto(void)
{
if(Right_PWM_ON)
{
if(pwm_val_right<=push_val_right) //20ms内电平信号 111 111 0000 0000 0000 00
{
ENB=1; //占空比6:20
}
else
{
ENB=0;
}
if(pwm_val_right>=20)
pwm_val_right=0;
}
else
{
ENB=0; //若未开启PWM则EN2=0 右电机 停止
}
}

/***************************************************/
/*TIMER0中断服务子函数产生PWM信号*/
void timer0()interrupt 1 using 2
{
TH0=0XFC; //1Ms定时
TL0=0X66;
pwm_val_left++;
pwm_val_right++;
pwm_out_left_moto();
pwm_out_right_moto();
}

51单片机PWM信号的产生与应用
https://kevinloongc.github.io/posts/105ab53e.html
作者
Kevin Loongc
发布于
2019年4月20日
许可协议