標(biāo)題: 關(guān)于51單片機(jī)生成spwm波驅(qū)動(dòng)舵機(jī)轉(zhuǎn)動(dòng) 求幫助 [打印本頁(yè)]

作者: icecryonarita    時(shí)間: 2018-9-22 00:31
標(biāo)題: 關(guān)于51單片機(jī)生成spwm波驅(qū)動(dòng)舵機(jī)轉(zhuǎn)動(dòng) 求幫助
想請(qǐng)教關(guān)于51單片機(jī)如何生成spwm并且通過(guò)這個(gè)波驅(qū)動(dòng)舵機(jī)的問(wèn)題。希望能夠得到源代碼,多謝了。

作者: devcang    時(shí)間: 2018-9-22 08:19

pwm可以 本站中找到。 而單片機(jī)不可以直接驅(qū)動(dòng)電機(jī),所以,還要硬件的驅(qū)動(dòng)部分的。本站的資料很多,搜索看看吧。
作者: angmall    時(shí)間: 2018-9-22 11:03
我給你來(lái)個(gè)試試


  1. //軟件模擬pwm

  2. #include"reg52.h"

  3. unsigned int num=0;
  4. //舵機(jī)
  5. sbit DJ1=P3^6;
  6. sbit DJ2=P3^7;          /*引腳定義*/
  7. int DJ(int a);         //函數(shù)聲明

  8. timerinit()            //定時(shí)器中斷初始化
  9. {
  10.         TMOD=0x01;                               //設(shè)置定時(shí)器0為工作方式1
  11.         EA=1;                                    //開總中斷
  12.         ET0=1;                                   //定時(shí)器0中斷允許
  13.         TH0 = (65536-500)/256;                  //初值使得定時(shí)器0.5毫秒溢出
  14.         TL0 = (65536-500)%256;
  15.         TR0=0;         
  16. }

  17. main()
  18. {
  19.         timerinit();
  20.         while(1)
  21.         {
  22.         }
  23. }

  24. timer()  interrupt 0       //0.5ms發(fā)生一次中斷,20ms后定時(shí)器置0重新計(jì)數(shù)
  25. {
  26.         num++;
  27.         DJ1=DJ(3);
  28.         DJ2=DJ(3);
  29.         if(num>=40)     
  30.         {
  31.                 num=0;
  32.                 TH0 = (65536-500)/256;                  //初值使得定時(shí)器0.5毫秒溢出
  33.                 TL0 = (65536-500)%256;
  34.                 return;
  35.         }
  36. }

  37. int DJ(char a)           //當(dāng)a=3舵機(jī)所在的位置是0度a=2 a=1分別對(duì)應(yīng)的位置是-45 -90度a=4 a=5對(duì)應(yīng)位置為45 90度
  38. {
  39.         if(num>=a||num>=5)
  40.            return 0;
  41.         if(num>=1)
  42.            return 1;
  43. }

復(fù)制代碼

作者: angmall    時(shí)間: 2018-9-22 11:10
我給你來(lái)多一個(gè)程序試試

  1. // 舵機(jī) 左右90度轉(zhuǎn)動(dòng) 親測(cè)可用


  2. #include<reg52.h>
  3. typedef unsigned int uint;
  4. typedef unsigned char uchar;
  5. sbit pwm=P0^3;//輸出PWM信號(hào)
  6. uint pwm_value=1500;//初值為1.5ms
  7. uint value[]={1500,650,1500,2500,1500};//舵機(jī)的轉(zhuǎn)角度

  8. void delay_ms(uint x)
  9. {
  10.         uint i;
  11.         while(x--)for(i=0;i<125;i++);
  12. }
  13. void InitTimer(void)
  14. {
  15.         TMOD=0x11;//開定時(shí)器0,1
  16.         TH0=-20000/256;//定時(shí)20MS,20MS為一個(gè)周期
  17.         TL0=-20000%256;
  18.         TH1=-1500/256;//定時(shí)1.5MS,這時(shí)舵機(jī)處于0度
  19.         TL1=-1500%256;
  20.         EA=1;//開總斷
  21.         TR0=1;//開定時(shí)器0
  22.         ET0=1;
  23.         TR1=1;//開定時(shí)器1
  24.         ET1=1;
  25. }
  26. void timer0(void) interrupt 1//定時(shí)器0中斷函數(shù)
  27. {
  28.         pwm=1;
  29.         TH0=-20000/256;
  30.         TL0=-20000%256;
  31.         TR1=1;
  32. }
  33. void timer1(void) interrupt 3//定時(shí)器1中斷函數(shù)
  34. {
  35.         pwm=0;
  36.         TH1=-pwm_value/256;
  37.         TL1=-pwm_value%256;
  38.         TR1=0;
  39. }
  40. void main(void)//主函數(shù)
  41. {
  42.         uchar i;
  43.         InitTimer();
  44.         pwm_value=1500;
  45.         while(1)
  46.         {
  47.                 for(i=0;i<5;i++)
  48.                 {
  49.                         pwm_value=value[i];//通過(guò)數(shù)組就可以改變舵機(jī)的轉(zhuǎn)角度
  50.                         delay_ms(1000);
  51.                 }
  52.         }
  53. }

復(fù)制代碼

作者: smofx    時(shí)間: 2018-9-22 17:21
牛人,具有參考價(jià)值
作者: cjm82    時(shí)間: 2018-9-24 21:25
SPWM波是等腰三角形波,多用于變頻器.一般的舵機(jī)應(yīng)該用的是PWM.
作者: xiou    時(shí)間: 2018-10-19 09:41
舵機(jī)轉(zhuǎn)動(dòng) 通過(guò)單片機(jī)輸出pwm控制 ,可以先去看看舵機(jī)原理
作者: 我對(duì)你情有獨(dú)鐘    時(shí)間: 2019-4-5 16:40
單片機(jī)是控制,不是驅(qū)動(dòng),驅(qū)動(dòng)需要芯片




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1