【Proteus仿真】51单片机PWM信号控制舵机

该文介绍了如何在Proteus环境中,通过80C52单片机利用PWM信号来控制舵机转动。代码基于VSMStudio和SDCC编译器,通过设置不同的占空比实现舵机0到180度的角度控制,并提供了相应的定时器初始化和延时函数。附带了仿真资源链接。
摘要由CSDN通过智能技术生成

【Proteus仿真】51单片机PWM信号控制舵机


  • 🔖Proteus仿真基础实验 - PWM信号控制舵机转动
  • 🌿Proteus8.12平台
  • 🌿本实验代码基于VSM Studio,采用SDCC编译器。
  • 🎬仿真演示:
    在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

  • 舵机控制一般需要一个20ms左右的时基脉冲,该脉冲的高电平部分一般为0.5ms-2.5ms范围内的角度控制脉冲部分,总间隔为2ms。以180度角度伺服为例,那么对应的控制关系是这样的:


   0.5ms--------01.0ms-------451.5ms-------902.0ms-------1352.5ms-------180

📝示例代码

/* 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值