找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7360|回复: 3
打印 上一主题 下一主题
收起左侧

51单片机控制舵机程序 红黄褐三根线PWM控制

[复制链接]
跳转到指定楼层
楼主
舵机有红黄褐三根线,红线接VCC,褐线接GND,黄线接PWM输入信号,用PWM信号控制舵机的转动
pwm信号的周期为20ms,0,5ms-0°,1ms-45°,1.5ms-90°,2.0ms-135°,2.5ms-180°,通过控制单片机使其在pwm引脚输出对应的pwm波形来控制舵机转动到指定的角度
下面我写的是用K1开关控制的舵机自动转动的程序,按下K1,舵机转动,再次按下K1,舵机停止转动
注意:因为舵机平均0.13MS转动60°,所以当产生指定的信号后需要维持一端时间,使舵机能转动到指定的角度,然后载改变PWM信号,信号维持时间的长短控制转动的快慢

//使用15系列51单片机的定时器2进行中断计时产生PWM波形信号
#include<STC15F2K60S2.h>
int flag=0;
sbit pwm1=P1^1;
sbit key1=P3^2;//开关1引脚
unsigned int value[]={6,11,16,21,16,11};//误差原因,6-0°,11-45°,16-90°,21-135°,26-180°
unsigned int percent = 0;//0.1ms次数标识
int k=0,count=0;
void Timer0Initial()
{
        T2L = 0xAE;               
        T2H = 0xFB;
} //定时0.1ms,11.0592MHz,0.01%的误差

void initial_Timer()
{
        
                  
        
        AUXR |= 0x04;        //设置1T模式
               
        Timer0Initial();        
        
        AUXR |= 0x10;//定时器2开始计时
        IE2 |=0x04;        //允许定时器2中断
        EA = 1;        //打开总中断
}

void delay(unsigned int x)
{
        unsigned int i,j;
        for(i = 0;i< x; ++i)
                for(j = 120; j >0 ; --j)
                        ;
}//延时函数,1ms

void keyscan()//按键扫描函数
{
        if(key1 == 0)
        {
                delay(3);//按键消抖,延时消抖
                if(key1 == 0)
                {
                        
                        while(!key1);//按键放开
                        
                        flag=!flag;
                }
               
        }

        
}

void initial()
{
        key1 = 1;
        
        
        initial_Timer();
}//初始化

void Timer0() interrupt 12 //定时器2
{
        if(flag==1){//若打开开关
                percent += 1;//设置周期
                if(percent == 200)
                {
                        count++;
                        percent = 0;
                        pwm1 = 1;
                }//产生低电平,当达到20ms时,进入下个周期,重新产生蹈叩缙?
                if(percent == value[k])
                {
                        
                        pwm1 = 0;
                }//产生高电平,当时间达到时,变为低电平
                if(count==20){
                        count=0;
                        k++;
                        if(k==6)k=0;
                }//,13ms/60°,延时,给舵机时间转动到指定的角度
        }
        Timer0Initial();

}

剩下的程序在文件中
定时器2舵机.zip (29.63 KB, 下载次数: 86)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏6 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:658403 发表于 2019-12-9 00:03 | 只看该作者
驱动图中这个舵机  需要程序就行  还是需要舵机驱动模块?
回复

使用道具 举报

板凳
ID:725540 发表于 2020-4-27 12:35 | 只看该作者
qkaitt 发表于 2019-12-9 00:03
驱动图中这个舵机  需要程序就行  还是需要舵机驱动模块?

需要单独的舵机模块
回复

使用道具 举报

地板
ID:763807 发表于 2020-5-29 12:46 来自手机 | 只看该作者
song666 发表于 2020-4-27 12:35
需要单独的舵机模块

需要电源吗
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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