【Proteus仿真】51单片机PWM信号控制舵机
- 🔖Proteus仿真基础实验 -
PWM信号控制舵机转动
- 🌿Proteus
8.12
平台 - 🌿本实验代码基于VSM Studio,采用SDCC编译器。
- 🎬仿真演示:
- 🍁舵机控制原理图:
- 舵机控制一般需要一个20ms左右的时基脉冲,该脉冲的高电平部分一般为0.5ms-2.5ms范围内的角度控制脉冲部分,总间隔为2ms。以180度角度伺服为例,那么对应的控制关系是这样的:
0.5ms--------0度
1.0ms-------45度
1.5ms-------90度
2.0ms-------135度
2.5ms-------180度
脉冲信号驱动舵机角度,Proteus仿真
- 舵机不同角度信号控制
- 舵机参数配置:
- 信号设置:不同角度,设置不同的脉冲宽度。
📝示例代码
/* Main.c file generated by New Project wizard
*
* Created: 2023-5-25
* Processor: 80C52
* Compiler: SDCC for 8051
*/
#include <mcs51reg.h>
#define PWM_Period (0xB7FE)
#define SERVO_PIN (P2_0)
unsigned int ON_Period;
unsigned int OFF_Period;
unsigned int DutyCycle;
/* 函数在11.0592MHZ提供1ms的延迟 */
void delay(unsigned int count)
{
int i = 0;
int j = 0;
for(i=0; i<count; i++)
{
for(j=0; j<112; j++)
;
}
}
void timer0_init()
{
TMOD = 0x01;
TH0 = (PWM_Period>>8);
TL0 = PWM_Period & 0xFF;
TR0 = 1;
ET0 = 1;
}
void timer0_isp() __interrupt 1 __using 1
{
SERVO_PIN = !SERVO_PIN;
if (SERVO_PIN)
{
TH0 = (ON_Period>>8);
TL0 = ON_Period;
}
else
{
TH0 = (OFF_Period>>8);
TL0 = OFF_Period;
}
}
void Set_DutyCycle_To(float duty_cycle)
{
float period = 65535 - PWM_Period;
ON_Period = ((period/100.0) * duty_cycle);
OFF_Period = (period - ON_Period);
ON_Period = 65535 - ON_Period;
OFF_Period = 65535 - OFF_Period;
}
void main(void)
{
timer0_init();
EA = 1;
// Write your code here
while (1)
{
Set_DutyCycle_To(2.7); /* 0°*/
delay(1000);
Set_DutyCycle_To(6.33); /* 45°*/
delay(1000);
Set_DutyCycle_To(7.45); /* 90° */
delay(1000);
Set_DutyCycle_To(8.68); /* 135° */
delay(1000);
Set_DutyCycle_To(12); /* 180°*/
delay(1000);
}
}
📚仿真资源
链接: https://pan.baidu.com/s/1DSfX5NHGjLniGwQfwhLt0g
提取码: 8c7u
- 🔖其他说明:
在Proteus中进行VSM编译,需要配置指定SDCC编译器安装路径。
- 📍SDCC编译器下载:
https://sourceforge.net/projects/sdcc/files/