通过stm32实现舵机108度来回运动
根据工作原理,舵机的具体控制方法就是需要一个20ms左右的时基脉冲,
该脉冲的高电平部分一般为0.5ms~2.5ms范围内的角度控制脉冲部分。
脉冲宽度从0.5ms~2.5ms,相对应舵盘的位置为0~180度,呈线性变化。
***************一般舵机脉冲宽度20ms,高电平宽度与角度对应关系***********
0.5ms————0度;
1.0ms————45度;
1.5ms————90度;
2.0ms————135度;
2.5ms————180度;
根据上面的原理,我们知道单片机只要产生20ms的脉冲信号,通过改变高电平时间从0.5ms到2.5ms变化,就能使舵机转动到对应的角度
舵机控制原理动态图片演示:
stm32单片机源程序如下:
- #include "led.h"
- #include "delay.h"
- #include "sys.h"
- #include "pwm.h"
- int main(void)
- {
-
-
- delay_init(); //延时函数初始化
- LED_Init(); //初始化与LED连接的硬件接口
- TIM1_PWM_Init(199,7199);//不分频。PWM频率===(7200*200)/72000000=0.02=20ms
- while(1)
- {
-
-
- TIM_SetCompare1(TIM1,195);
- delay_ms(500);
- TIM_SetCompare1(TIM1,190);
- delay_ms(500);
- TIM_SetCompare1(TIM1,185);
- delay_ms(500);
-
- TIM_SetCompare1(TIM1,180);
- delay_ms(500);
-
- TIM_SetCompare1(TIM1,175);
- delay_ms(500);
-
- TIM_SetCompare1(TIM1,170);
-
- delay_ms(500);
-
- TIM_SetCompare1(TIM1,175);
-
- delay_ms(500);
-
- TIM_SetCompare1(TIM1,180);
-
- delay_ms(500);
-
- TIM_SetCompare1(TIM1,185);
-
- delay_ms(500);
-
-
-
- }
- }
复制代码 51单片机:
- #include <reg52.h>
- #define uint unsigned int
- #define uchar unsigned char
- sbit pwm=P0^0;
- sbit key7=P3^7;
- uchar count=0;
-
-
- void delayms(uint xms)
- {
- uint i,j;
- for(i=xms;i>0;i--)
- for(j=110;j>0;j--);
- }
-
- void Timer0_Init()
- {
- TMOD=0x01;
- TH0=(65536-200)/256;
- TL0=(66636-200)%256;
- EA=1;
- ET0=1;
- TR0=0;
- }
- void Timer0()interrupt 1
- {
- TH0=(65536-200)/256;
- TL0=(66636-200)%256;
-
- if(count<30)
- pwm=1;
- else
- pwm=0;
- count++;
- if(count==100)
- {
- TR0=0;
- count=0;
- }
-
- }
- void keyscan()
- {
- if(key7==0)
- {
- delayms(10);
- if(key7==0)
- {
- while(!key7);
-
- TR0=1;
- }
- }
- }
- void main()
- {
- Timer0_Init();
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
PWM舵机.zip
(3.04 MB, 下载次数: 126)
|