找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2571|回复: 7
打印 上一主题 下一主题
收起左侧

关于51单片机生成spwm波驱动舵机转动 求帮助

[复制链接]
跳转到指定楼层
楼主
ID:399093 发表于 2018-9-22 00:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
500黑币
想请教关于51单片机如何生成spwm并且通过这个波驱动舵机的问题。希望能够得到源代码,多谢了。

评分

参与人数 1黑币 +8 收起 理由
xiou + 8 很给力!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:277550 发表于 2018-9-22 08:19 | 只看该作者

pwm可以 本站中找到。 而单片机不可以直接驱动电机,所以,还要硬件的驱动部分的。本站的资料很多,搜索看看吧。

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

板凳
ID:155507 发表于 2018-9-22 11:03 | 只看该作者
我给你来个试试


  1. //软件模拟pwm

  2. #include"reg52.h"

  3. unsigned int num=0;
  4. //舵机
  5. sbit DJ1=P3^6;
  6. sbit DJ2=P3^7;          /*引脚定义*/
  7. int DJ(int a);         //函数声明

  8. timerinit()            //定时器中断初始化
  9. {
  10.         TMOD=0x01;                               //设置定时器0为工作方式1
  11.         EA=1;                                    //开总中断
  12.         ET0=1;                                   //定时器0中断允许
  13.         TH0 = (65536-500)/256;                  //初值使得定时器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发生一次中断,20ms后定时器置0重新计数
  25. {
  26.         num++;
  27.         DJ1=DJ(3);
  28.         DJ2=DJ(3);
  29.         if(num>=40)     
  30.         {
  31.                 num=0;
  32.                 TH0 = (65536-500)/256;                  //初值使得定时器0.5毫秒溢出
  33.                 TL0 = (65536-500)%256;
  34.                 return;
  35.         }
  36. }

  37. int DJ(char a)           //当a=3舵机所在的位置是0度a=2 a=1分别对应的位置是-45 -90度a=4 a=5对应位置为45 90度
  38. {
  39.         if(num>=a||num>=5)
  40.            return 0;
  41.         if(num>=1)
  42.            return 1;
  43. }

复制代码
回复

使用道具 举报

地板
ID:155507 发表于 2018-9-22 11:10 | 只看该作者
我给你来多一个程序试试

  1. // 舵机 左右90度转动 亲测可用


  2. #include<reg52.h>
  3. typedef unsigned int uint;
  4. typedef unsigned char uchar;
  5. sbit pwm=P0^3;//输出PWM信号
  6. uint pwm_value=1500;//初值为1.5ms
  7. uint value[]={1500,650,1500,2500,1500};//舵机的转角度

  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;//开定时器0,1
  16.         TH0=-20000/256;//定时20MS,20MS为一个周期
  17.         TL0=-20000%256;
  18.         TH1=-1500/256;//定时1.5MS,这时舵机处于0度
  19.         TL1=-1500%256;
  20.         EA=1;//开总断
  21.         TR0=1;//开定时器0
  22.         ET0=1;
  23.         TR1=1;//开定时器1
  24.         ET1=1;
  25. }
  26. void timer0(void) interrupt 1//定时器0中断函数
  27. {
  28.         pwm=1;
  29.         TH0=-20000/256;
  30.         TL0=-20000%256;
  31.         TR1=1;
  32. }
  33. void timer1(void) interrupt 3//定时器1中断函数
  34. {
  35.         pwm=0;
  36.         TH1=-pwm_value/256;
  37.         TL1=-pwm_value%256;
  38.         TR1=0;
  39. }
  40. void main(void)//主函数
  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];//通过数组就可以改变舵机的转角度
  50.                         delay_ms(1000);
  51.                 }
  52.         }
  53. }

复制代码
回复

使用道具 举报

5#
ID:401351 发表于 2018-9-22 17:21 | 只看该作者
牛人,具有参考价值
回复

使用道具 举报

6#
ID:388197 发表于 2018-9-24 21:25 | 只看该作者
SPWM波是等腰三角形波,多用于变频器.一般的舵机应该用的是PWM.

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

7#
ID:405273 发表于 2018-10-19 09:41 | 只看该作者
舵机转动 通过单片机输出pwm控制 ,可以先去看看舵机原理
回复

使用道具 举报

8#
ID:481641 发表于 2019-4-5 16:40 | 只看该作者
单片机是控制,不是驱动,驱动需要芯片
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表