51单片机控制舵机转角的C语言程序

51单片机控制舵机转角的C语言程序,第1张

舵机频率50hz就是说一周期是20ms,占空比在百分之2.5到12.5可以从-90转到90度

单片机内部有工作的晶振频率,定时器就是基于这个频率计时,根据程序可以知道,20ms计时20000,所以计时器每加一的时间为1us,这个程序的意思就是先工作定时器0,20ms后输出置为1并打开定时器1,定时器1计时到1.5ms后触发中断使得输出为0,即占空比为1.5/20=百分之7.5,中间位置

定时器的寄存器加到0会触发中断,所以寄存器都写负数,如想要20ms就写-20000,这样往上加到0需要的计数的次数就为20000,一次计数为1us,所以为20ms,而寄存器是由两个八位寄存器组成的,所以20000要分开写

建议有时间可以去看一下郭天祥老师的51单片机视频,能搜到而且不多,貌似第三集是讲的定时器

以前帮人解决的;

/**舵机控制——火柴天堂作品-20120314**/

/**50Hz舵机,0.5ms-2.5ms 对应 0-180°(-90°~90°)**/

/**51系列单片机,晶振12MHz,P1.0输出50Hz PWM调制方波(即周期20ms)驱动舵机,方波由T0定时器产生

P11-P17,7个光电检测,P11-130.5°,P12-108°,P13-99°,P14-90°,P15-81°,P16-72°,P17-49.5°,优先级高-低:P14→P11/P17→P12/P16→P13/P15 **/

#include"reg52.h" //包含52系列头文件

#define uchar unsigned char //定义 无符号字符型

#define uint unsigned int //定义 无符号整型

//#define TRUE 1 //定义 逻辑真

//#define FALSE 0 //定义 逻辑假

//最小角度4.5°,时间应该为2ms×4.5°/180°=50us,故定时器T0定时时间为 50us

#define th0 0xce //50us for Model2 at 12HMz Fosc

#define DutyDeno 40 //定义 占空比分母(舵机转动范围) 为:180°/4.5°=40

#define SteeringBasic 10 //舵机基准角 0.5ms, 0.5ms/50us=10

#define SteerineSigne 400 //舵机信号 20ms, 20ms/50us=400

uchar code SteeringList[8]={0,29,24,22,20,18,16,11} //P11-P17光电检测对应舵机转角列表,单位4.5°,第一个元素为空

sbit PS1=P1^0 //定义 光电开关1 接口

sbit PS2=P1^1 //定义 光电开关2 接口

sbit PS3=P1^2 //定义 光电开关3 接口

sbit PS4=P1^3 //定义 光电开关4 接口

sbit PS5=P1^4 //定义 光电开关5 接口

sbit PS6=P1^5 //定义 光电开关6 接口

sbit PS7=P1^6 //定义 光电开关7 接口

sbit Steering=P1^7 //定义 舵机输出 接口

#define PS1_Value 1 //定义 光电开关1 值

#define PS2_Value 2 //定义 光电开关2 值

#define PS3_Value 3 //定义 光电开关3 值

#define PS4_Value 4 //定义 光电开关4 值

#define PS5_Value 5 //定义 光电开关5 值

#define PS6_Value 6 //定义 光电开关6 值

#define PS7_Value 7 //定义 光电开关7 值

uchar DutyNume //定义 占空比分子(舵机转角) 变量,单位4.5°

void Timer0() interrupt 1 //定时器T0 中断 函数

{

static uint duty_time=0 //定义静态变量,作为 占空比 输出时间的参考值(50us)

duty_time=++duty_time%SteerineSigne //该句等效于:duty_time++duty_time%=SteerineSigne

if(duty_time<DutyNume+SteeringBasic) Steering=1 //若计时时间小于 占空比分子,则输出应为 高电平

else Steering=0 //若计时时间大于 占空比分子,则输出应为 低电平

}

void TimerInit() //定时器初始化 函数

{

TMOD=0x02 //T0 8位自重装定时器

EA=1 //允许系统中断

ET0=1 //允许T0中断

TH0=th0

TL0=th0 //50us 初值

TR0=1 //T0开始计时

}

uchar PhotoSwitchScan() //光电开关扫描 函数

{

if(!PS4) return PS4_Value //返回光电开关对应值

if(!PS1) return PS1_Value

if(!PS7) return PS7_Value

if(!PS2) return PS2_Value

if(!PS6) return PS6_Value

if(!PS3) return PS3_Value

if(!PS5) return PS5_Value //返回光电开关对应值

return PS4_Value //其它情况,均保持跟最高级别一致

}

void PhotoSwitchResp() //光电开关响应 函数

{

//uchar PS_value=PhotoSwitchScan() //扫描光电开关

//if(PS_value)DutyNume=SteeringList[PS_value] //占空比分子 加1,即舵机转角加4.5°,到180°后,再加归零

DutyNume=SteeringList[PhotoSwitchScan()]

}

void main() //主函数

{

TimerInit() //调用 定时器初始化 函数

while(1) //循环系统

{

PhotoSwitchResp() //调用 光电开关响应 函数

}

}

1、PWM波是控制直流电机的

通俗的说,5V直流电机在5V的情况下肯定速度最快,在0V的情况下肯定不转了

这样电源0~5V就对应了不同的速度

问题是怎么才能实现0~5V的变化呢?

于是就用PWM波控制mos管来给直流电机供电。PWM就是一个矩形波,通过控制高电平和低电平的时间来控制MOS管导通的时间。MOS管在高电平的时候导通,就相当于5V电源直接加到电机上;MOS管在低电平的时候截止,就相当于0V电源加到电机上。

PWM又叫脉宽调制,就是控制高电平占一个周期的比例。而这个PWM波就是控制5V电源加到电机上的时间,从而控制了电机。

2、例程:

#include <reg52.h>

sbit KEY1 = P3^4

sbit PWM = P1^5

unsigned char CYCLE//定义周期 该数字X基准定时时间 如果是10 则周期是10 x 0.1ms

unsigned char PWM_ON //定义高电平时间

void delay(unsigned int cnt)

{

while(--cnt)

}

main()

{

unsigned char PWM_Num//定义档位

TMOD |=0x01//定时器设置 1ms in 12M crystal

TH0=(65536-1000)/256

TL0=(65536-1000)%256//定时1mS

IE= 0x82 //打开中断

TR0=1

CYCLE = 10// 时间可以调整 这个是10步调整 周期10ms 8位PWM就是256步

while(1)

{

if(!KEY1)

{

delay(10000)

if(!KEY1)

{

PWM_Num++

if(PWM_Num==4)PWM_Num=0

switch(PWM_Num){

case 0:P0=0x06PWM_ON=0break//高电平时长

case 1:P0=0x5BPWM_ON=4break

case 2:P0=0x4FPWM_ON=6break

case 3:P0=0x66PWM_ON=8break

default:break

}

}

}

}

}

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

/* 定时中断*/

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

void tim(void) interrupt 1 using 1

{

static unsigned char count//

TH0=(65536-1000)/256

TL0=(65536-1000)%256//定时1mS

if (count==PWM_ON)

{

PWM = 1//灯灭

}

count++

if(count == CYCLE)

{

count=0

if(PWM_ON!=0) //如果左右时间是0 保持原来状态

PWM = 0//灯亮

}


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/11246832.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-14
下一篇 2023-05-14

发表评论

登录后才能评论

评论列表(0条)

保存