微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 求高手指教一下我这个舵机控制程序,本意是想控制舵一分钟后结束,但现在舵机不动。

求高手指教一下我这个舵机控制程序,本意是想控制舵一分钟后结束,但现在舵机不动。

时间:10-02 整理:3721RD 点击:
#include<reg52.h>
#define uint unsigned int
sbit pwm=P2^0;
uint num,end,jd;  //定义高电平时间标识、程序运行时间和角度标识
void main()  //主函数
{
        TMOD=17;  //定时器0和1工作在方式1
        TH0=(65535-459)/256;  //定时器1定时时间为0.5ms,11.0592晶振
        TL0=(65535-459)%256;
        TH1=(65535-18349)/256;  //定时器2定时时间为20ms,11.0592晶振
        TL1=(65535-18349)%256;
        EA=1;  //打开中断总开关
        ET0=1;  //打开TO定时开关
        ET1=1;  //打开T1定时开关
        TR0=1;  //T0定时器开始
        TR1=1;  //T1定时器开始
        jd=1;  //为角度标识赋一个初值
        num=0;  //为高电平标识赋一个初值
        while(1)  //大循环等待
        {
          if(end==3000)  //如果时间到达一分钟,则程序停止
            {
                   EA=0;
                   while(1);
            };
  }
}       
void time1()interrupt 1   //T0中断程序
{
TH0=(65535-459)/256;  //重新赋值
TL0=(65535-459)%256;
        num++;  //每中断一次,NUM加1,大于角度标识后将输出设为低电平,NUM数值清零,同时关闭此中断
          if(num>jd)
          {
                  pwm=0;
                  num=(num+1);
                  TR0=0;
          }
}
void time3()interrupt 3   //T1中断程序
{
        TH1=(65535-18349)/256;  //重新赋值
        TL1=(65535-18349)%256;
        jd=(jd+1);
        end=(end+1);
        TR0=1;  //重新打开T0中断
        pwm=1;  //每次T1中断后,IO口电平重新设为高电平
          if(jd>4)  //每当角度标识大于4,也就是高电平时间大于2MS时,重新设置为0.5MS
                {
                        jd=1;
                }
}

1.5ms之后你的num是不是一直大于jd了,还有我用步进的时候以前电脑供电单片机0步进驱动的时候好像电压不足有一小段响应时间的舵机用的少不知道有没有,舵机是根据PWM波的占空比不同来改变角度的,用之前可以先拿示波器试试的

示波器这东西现在还没入手。NUM不会大于角度,因为我在T0中断函数里设定了当NUM加到比JD大的时候就会将它清0,并且关闭T0中断,这样的话,直到T1中断发生时再打开T0中断前,NUM就是不动的了。

先固定占空比测试一下,看看是不是PWM产生出问题了

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top