通過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)
2018-4-25 15:46 上傳
點擊文件名下載附件
舵機程序
|