找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2163|回复: 1
收起左侧

摇杆控制舵机转动角度

[复制链接]
ID:875485 发表于 2021-4-4 18:05 | 显示全部楼层 |阅读模式
摇杆控制舵机转动角度
#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
#include<stdio.h>
#include "delay.h"
#include "i2c.h"
/*********


舵机的控制一般需要一个20ms左右的时基脉冲,
该脉冲的高电平部分一般为0.5ms~2.5ms范围内的角度控制脉冲部分。
以180度角度伺服为例,那么对应的控制关系是这样的:
   0.5ms--------------0度;
   1.0ms------------45度;
   1.5ms------------90度;
   2.0ms-----------135度;
   2.5ms-----------180度;


***********/


sbit motor=P1^0;
unsigned char num=1;


unsigned long time_20ms=0;                   //定时器计数


void Init_Timer0(void);


unsigned int moTimHigh,moTimlow; //电机控制 高低电平处理时间
unsigned char dealAdVal = 0; //ad处理值
unsigned char remAdVal = 0;        //记录上一次ad值
void main (void)
{     
        Init_Timer0();        //定时器0初始化


        DelayMs(20);          //延时有助于稳定
while (1)         //主循环
        {
                dealAdVal =ReadADC(0);         //ADtemp的取值范围是0-255,定时的时间范围是0.5-2.5ms
                if(dealAdVal>remAdVal) //取 前后两次ad采集值差值
                {
                         if((dealAdVal-remAdVal)>10)//偏转较大位置
                        {
                                remAdVal = dealAdVal  ;//ad记录
                        }                          
                }
                else
                {
                         if((remAdVal-dealAdVal)>10)//偏转较大位置
                        {
                                remAdVal = dealAdVal  ;//ad记录
                        }               
                }
                //从上述12M计算公式可以换算出11.0592M计算方式
                moTimHigh=(65535-500.0*0.9216)-(2000.0*0.9216/255.0)*ReadADC(0);  //11.0596M情况下  11.0596/12=0.9216
                moTimlow=(65535-19500.0*0.9216)+(2000.0*0.9216/255.0)*ReadADC(0);        //11.0596M情况?
                
                DelayMs(10);
        }
}


void Init_Timer0()
{
//**All notes can be deleted and modified**//
  TMOD |= 0x10;              //定时器设置 0.1ms in 11.0592M crystal
//        TH0=(65536-78)/256;
//        TL0=(65536-78)%256;      //定时0.1mS
        ET0=1;//定时器中断打开
        EA=1;//总中断
        TR0=1;   //启动定时器0
}




void T0_time() interrupt 1
{
        static unsigned char count;
       
        if (!count)
        {
                motor = 1;            //给高电平
                TH0=moTimHigh/256;
                TL0=moTimHigh%256;   
        }
        else
        {
                motor=0 ;
                TH0=moTimlow/256;
                TL0=moTimlow%256;     
        }
        count=~count;               
}
仅供参考

回复

使用道具 举报

ID:1025516 发表于 2022-5-29 20:41 | 显示全部楼层
你这个代码严重不全,首先你的那个几个.h文件没有说明,还有那个ReadADC应该是个函数你没写吧
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表