求一个PWM单片机简单控制舵机程序

如题所述

以前帮人解决的;
/**舵机控制——火柴天堂作品-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(); //调用 光电开关响应 函数
}
}追问

我只想一个很简单很简单的,能正转多少度,然后在反转多少的。谢谢

温馨提示:内容为网友见解,仅供参考
无其他回答

单片机编程控制舵机求救啊啊
if(Num<Servo[i].PWM_L) P1=P1 & ~(0X01<=Servo[i].PWM_L && Num<Servo[i].PWM_T) P1=P1 | (0X01<0?Servo[i].PWM_Num-1,0;\/\/表示已发完一次PWM,要自减1.} else Servo[i].Now_Angle=Servo[i].Next_Angle; \/\/表示转完了,所以这个值要改变 } } 这种思路主要是...

如何用51单片机控制舵机的??单片机程序是怎么写的?希望你也能给我发...
TL0=0x33; \/\/11.0592MHZ晶振,0.5ms TR0=1;} \/\/定时器0中断程序 void Time0() interrupt 1 { TH0=0xfe;TL0=0x33;if(count<jd) \/\/判断0.5ms次数是否小于角度标识 pwm=1; \/\/是,pwm输出高电平 else pwm=0; \/\/否,输出低电平 count=count+1;count=count%40; \/\/次数始终保持为...

在STM32中使用PWM输出控制舵机
1. 初始化TIM外设,包括时钟、引脚、预分频器、周期和PWM模式等的配置。2. 根据舵机的控制信号范围(通常为1ms到2ms),计算出对应的占空比范围。3. 配置TIM通道的比较值,用于控制舵机的角度。4. 启动TIM,开始生成PWM信号。5. 调整舵机的角度,通过改变比较值来改变PWM信号的占空比。6. 在程序中进...

单片机PMW波问题
建议你使用STC单片机,里面有专用的PWM硬件 你的程序有问题:void t0()interrupt 1{ D_count++; if( D_count==D_num) Duoj=0; \/\/低电平 if(D_count==40)\/\/500us*40=20ms { D_count=0; Duoj=1; \/\/高电平 } TH0=(65536-500)\/256; \/\/基本时间...

PWM程序控制舵机,求助其中的几个参数问题
\/**舵机控制——火柴天堂作品-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...

怎么用51单片机控制舵机?
操作步骤:1 单片机,舵机,电源共地;2 用两个稳压芯片进行供电,将电源分开来;3 舵机信号端没有直接连接单片机IO口,我串了一个10K的电阻,也就是这一步之后就可以控制舵机。

PWM原理+SG90舵机控制原理+STM32CubeMx配置输出可调PWM波
在编程方面,我们使用STM32CubeMx建立工程,配置定时器输出20ms的周期,并调整占空比以控制舵机角度。我参考了Arduino的方法,每15ms调用一次函数,控制舵机角度,实现平滑转动。以下是主函数的伪代码示例:c int main(void) { MX_TIM1_Init();HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_1);HAL_TIM_...

如果控制舵机?
如果系统中需要控制几个舵机的准确转动,可以用单片机和计数器进行脉冲计数产生PWM信号。脉冲计数可以利用51单片机的内部计数器来实现,但是从软件系统的稳定性和程序结构的合理性看,宜使用外部的计数器,还可以提高CPU的工作效率。实验后从精度上考虑,对于FUTABA系列的接收机,当采用1MHz的外部晶振时,其...

用51单片机控制3路舵机
回答:这个可以用三个I\/o口,用定时器0分时启动三路PWM波,代码的话,每次中断给计数器赋下次中断的时间,void T0_time() interrupt 1 \/\/通过定时器0产生多路PWM,每次中断赋值下一次中断的时间, { \/\/两个t[]一组,在20ms周期内分时启动各路PWM高电平, TH0=(65536-9.216*t[i])\/256; \/\/各...

舵机角度pwm计算公式
舵机安装前需要调中,需要计算出舵机调中的PWM输出值。 占空比 = PWM输出值 \/ PWM最大值 舵机调中的PWM输出值 = 占空比 * PWM最大值 根据舵机0°时与脉冲宽度的关系得知,对应的占空比为1.5\/20。占空比常用以百分比形式表示,通常用符号"D"来表示。它的计算公式为:D=t\/T×100%。其中,t代表...

相似回答