找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3238|回复: 21
收起左侧

单片机+舵机不能控制速度吗?转的太快了,能不能慢慢的转?

  [复制链接]
ID:475031 发表于 2021-8-14 10:18 | 显示全部楼层 |阅读模式
舵机不能控制速度吗?转的太快了,一按不到1秒时间就转到位了。能不能慢慢的转?转它割10秒钟到位 45345.gif

我的舵机是
MG996R按一个按钮旋转180度,按另一个按钮反转回来,
感觉速度太快了。能不能慢慢的旋转?
我用的8脚单片机型号是STC15W204S,其实用89C52单片机测试也是一样的效果,换下头文件即可,


下面是单片机代码,
网上资料说改定时器中断初始时间,我也改过不同时间(0.1MS至5ms),都没有效果。
  TH0=0Xfe;
  TL0=0X33; //计数初值设置为0.5ms


又说改PWM时间,下面40我改为10至500也还是改变不了速度,还是老样子
  count++;
  if(count>=40)//原始是=40
  {
    count=0;
  }


老师们,到底要怎么改,才能控制舵机速度?谢谢指导,,
  1. #include        "STC15Fxxxx.H"
  2. //#include <intrins.h>
  3. #define uint  unsigned int            //定义一下方便后面使用
  4. //#define uchar unsigned char     //定义一下方便后面使用
  5. #define MAIN_Fosc 11059200L//定义主时钟
  6. sbit SG_PWM=P3^2;
  7. sbit Key_1=P5^4;
  8. sbit Key_2=P5^5;
  9. unsigned char count=0;
  10. unsigned char PWM_count=1;             //1--0度,2--45度,3--90度,4--135度,5--180度
  11. void delay(unsigned char i)          //延时
  12. {
  13.   unsigned char j,k;
  14.   for(j=i;j>0;j--)
  15.     for(k=125;k>0;k--);
  16. }




  17. void Timer_Init()
  18. {
  19.   TMOD=0X01;      //T0定时方式1
  20.   TH0=0Xfe;
  21.   TL0=0X33;       //计数初值设置为0.5ms          每0.5ms进入一次中断,晶振频率:11.0592MHZ
  22.   ET0=1;          //打开定时器0的中断
  23.   TR0=1;          //打开定时器0
  24.   EA=1;           //开总中断
  25. }
  26. void Timer() interrupt 1   //特别注意此处,0--外部中断0,1--定时器中断0,2--外部中断1,3--定时器中断1,4--串行口中断1
  27. {
  28.   TR0=0;
  29.   TH0=0Xfe;
  30.   TL0=0X33;       //重新赋计数初值为0.5ms

  31.   if(count<=PWM_count)
  32.   {
  33.     SG_PWM=1;
  34.   }
  35.   else
  36.   {
  37.     SG_PWM=0;
  38.   }
  39.   count++;
  40.   if(count>=40)//原始是=40
  41.   {
  42.     count=0;
  43.   }
  44.   TR0=1;
  45. }
  46. void main()
  47. {
  48.   Timer_Init();
  49.   while(1)
  50.   {
  51.    if(Key_1==0)
  52.    {
  53.      delay(10);
  54.      EA=0;
  55.      if(Key_1==0)
  56.      {
  57.       PWM_count=1;//1--0度
  58.                
  59.       count=0;
  60.       EA=1;
  61.      }
  62.      while(!Key_1);
  63.    }
  64.    if(Key_2==0)
  65.    {
  66.      delay(10);
  67.      EA=0;
  68.      if(Key_2==0)
  69.      {
  70.       PWM_count=5;//4--135度  转动角度
  71.                
  72.       count=0;
  73.       EA=1;
  74.      }
  75.      while(!Key_2);
  76.    }   
  77.   }
  78. }
复制代码

单片机源程序: 996舵机按键控制正反转.rar (24.96 KB, 下载次数: 12)
回复

使用道具 举报

ID:807591 发表于 2021-8-14 11:23 | 显示全部楼层
把180度分解开,每间隔一定时间转一个角度。。这种问题哪怕自己动脚趾头想一想也就知道了。。非得动手发帖。。
回复

使用道具 举报

ID:959346 发表于 2021-8-14 12:10 | 显示全部楼层
不要一次转180度,慢慢加到180度试一下。
回复

使用道具 举报

ID:342822 发表于 2021-8-14 12:38 | 显示全部楼层
计数初值设置为0.5ms每次步进0.1ms暂停?直到2.5ms试试看
回复

使用道具 举报

ID:951194 发表于 2021-8-14 12:41 | 显示全部楼层
控制pwm的占空比来调速
回复

使用道具 举报

ID:161164 发表于 2021-8-14 12:50 | 显示全部楼层
你的角度分辨率太低了
而且角度改变又太突然,没有缓冲
以下是舵机控制信号
Servomotor_Timing_Diagram.svg.png

可以见到由0到90度之间的高电平时间差为500us
即5.55us一度
如不需太细分角度,可把定时器设为55us
count的最大值为:20000us / 55us = 363
而PWM_count对应各角度的值就自己算吧


缓冲问题可以在按键时不直接对PWM_count赋值
而是另开一个暂存变数如PWM_count_buff
再另加程序
if(PWM_count_buff > PWM_count){
PWM_count++;
}
if(PWM_count_buff < PWM_count){
PWM_count--;
}
以上两个If的更新速度就是转动速度

回复

使用道具 举报

ID:960487 发表于 2021-8-14 13:50 | 显示全部楼层
舵机一步高电平, 一步低电平, 然后等待一个时间段, 再循环如此, 就可以慢了
回复

使用道具 举报

ID:475031 发表于 2021-8-14 18:55 | 显示全部楼层
Jiang_YY 发表于 2021-8-14 12:10
不要一次转180度,慢慢加到180度试一下。
  1. if(Key_2==0)
  2.    {
  3.      delay(10);
  4.      EA=0;
  5.      if(Key_2==0)
  6.      {
  7.        delay_ms(1000);//1000ms毫秒=1s秒
  8.                          PWM_count=1;/0度  角度
  9.                          delay_ms(1000);/
  10.                          PWM_count=2;//45度  角度
  11.                          delay_ms(1000);/
  12.                          PWM_count=3;//90度  角度
  13.                          delay_ms(1000);/
  14.                          PWM_count=4;//135度  角度
  15.                          delay_ms(1000);//
  16.                          PWM_count=5;//180度  角度
  17.        
  18.                
  19.       count=0;
  20.       EA=1;
  21.      }
复制代码
这样吗?试过了; 。没有效果。依然快速旋转的,
回复

使用道具 举报

ID:475031 发表于 2021-8-14 18:55 | 显示全部楼层
szb314 发表于 2021-8-14 11:23
把180度分解开,每间隔一定时间转一个角度。。这种问题哪怕自己动脚趾头想一想也就知道了。。非得动手发帖 ...

你这个方案不行,我试过
回复

使用道具 举报

ID:424598 发表于 2021-8-14 21:24 | 显示全部楼层
uchar最大才支持255,你输1000有啥用,要换成uint
回复

使用道具 举报

ID:475031 发表于 2021-8-14 21:25 | 显示全部楼层
lkc8210 发表于 2021-8-14 12:50
你的角度分辨率太低了
而且角度改变又太突然,没有缓冲
以下是舵机控制信号

大师,你说的根本不可能实现。资料网上找遍了,。
没有一例能成功控制舵机速度的,
都是只是停留在纸上谈兵理论,,,
根本不可能实现速度控制, 是我多想了。
回复

使用道具 举报

ID:161164 发表于 2021-8-14 22:04 | 显示全部楼层
鬼推磨 发表于 2021-8-14 18:55
这样吗?试过了; 。没有效果。依然快速旋转的,

你知道EA=0;和EA=1;代表什么吗?
回复

使用道具 举报

ID:959346 发表于 2021-8-14 22:39 | 显示全部楼层
鬼推磨 发表于 2021-8-14 18:55
这样吗?试过了; 。没有效果。依然快速旋转的,

你在开始的时候EA=0; 都不进中断了,一直到 EA=1; 之前,这段时间都没有进中断,舵机都没有操作,直到EA=1; 开中断后,舵机才开始操作,这时候你的角度已经是直接到最后的角度了,中间的操作根本没有起到作用。你先把EA=0 改成 EA=1; 简单点看看效果,再自己细调吧。
回复

使用道具 举报

ID:161164 发表于 2021-8-15 00:24 | 显示全部楼层
鬼推磨 发表于 2021-8-14 21:25
大师,你说的根本不可能实现。资料网上找遍了,。
没有一例能成功控制舵机速度的,
都是只是停留在纸上 ...

呵呵,不是不可能,只是你不能以下片段示范了-90/0/+90 及 快慢速控制
Key1 = -90, Key2 = 0, Key3 = +90, Key4 = 快慢速
示波器显示了PWM转换速度
20210815_000959.gif

回复

使用道具 举报

ID:939710 发表于 2021-8-15 06:37 | 显示全部楼层
自己设个目标值,可以用pid或者其他方法平滑增加或减少到目标值
回复

使用道具 举报

ID:420836 发表于 2021-8-15 09:04 | 显示全部楼层
这是个好信息,谢谢分享。
回复

使用道具 举报

ID:475031 发表于 2021-8-15 12:21 | 显示全部楼层
Jiang_YY 发表于 2021-8-14 22:39
你在开始的时候EA=0; 都不进中断了,一直到 EA=1; 之前,这段时间都没有进中断,舵机都没有操作,直到EA= ...
  1. void main()
  2. {
  3.   Timer_Init();
  4.   while(1)
  5.   {
  6.    if(Key_1==0)
  7.    {
  8.      delay(10);
  9.      EA=1;
  10.      if(Key_1==0)
  11.      {
  12.         delay_ms(100);//1000ms毫秒=1s秒
  13.                          PWM_count=5;//0度  角度
  14.                                  delay_ms(100);//1000ms毫秒=1s秒
  15.                          PWM_count=4.9;//0度  角度
  16.                                  delay_ms(100);//1000ms毫秒=1s秒
  17.                          PWM_count=4.8;//0度  角度
  18.                                  delay_ms(100);//1000ms毫秒=1s秒
  19.                          PWM_count=4.7;//0度  角度
  20.                          delay_ms(100);//1000ms毫秒=1s秒
  21.                          PWM_count=4.6;//0度  角度
  22.                          
  23.                          delay_ms(100);//1000ms毫秒=1s秒
  24.                          PWM_count=4.5;//0度  角度
  25.                          delay_ms(100);//1000ms毫秒=1s秒
  26.                          PWM_count=4.4;//0度  角度
  27.                          delay_ms(100);//1000ms毫秒=1s秒
  28.                          PWM_count=4.3;//0度  角度
  29.                          delay_ms(100);//1000ms毫秒=1s秒
  30.                          PWM_count=4.2;//0度  角度
  31.                          delay_ms(100);//
  32.                          PWM_count=4.1;//45度  角度
  33.                                                                                                                    delay_ms(100);//
  34.                          PWM_count=4;//45度  角度
  35.                                                                                                                    delay_ms(100);//
  36.                          PWM_count=3.9;//45度  角度
  37.                                                                                                                    delay_ms(100);//
  38.                          PWM_count=3.8;//45度  角度
  39.                                                                                                                    delay_ms(100);//
  40.                          PWM_count=3.7;//45度  角度
  41.                          delay_ms(100);//1000ms毫秒=1s秒
  42.                          PWM_count=3.6;//0度  角度
  43.                           delay_ms(100);//1000ms毫秒=1s秒
  44.                          PWM_count=3.5;//0度  角度
  45.                                                                                                   delay_ms(100);//1000ms毫秒=1s秒
  46.                          PWM_count=3.4;//0度  角度
  47.                                                                                                   delay_ms(100);//1000ms毫秒=1s秒
  48.                          PWM_count=3.3;//0度  角度
  49.                                                                                                   delay_ms(100);//1000ms毫秒=1s秒
  50.                          PWM_count=3.2;//0度  角度
  51.                                                                                                  
  52.                          delay_ms(100);//
  53.                          PWM_count=3.1;//90度  角度
  54.                                                                                                  delay_ms(100);//
  55.                          PWM_count=3;//90度  角度
  56.                                                                                                  delay_ms(100);//
  57.                          PWM_count=2.9;//90度  角度
  58.                                                                                                  delay_ms(100);//
  59.                          PWM_count=2.8;//90度  角度
  60.                                                                                                  delay_ms(100);//
  61.                          PWM_count=2.7;//90度  角度
  62.                          delay_ms(100);//1000ms毫秒=1s秒
  63.                          PWM_count=2.6;//0度  角度
  64.                          delay_ms(100);//
  65.                          PWM_count=2.5;//90度  角度
  66.                                                                                                  delay_ms(100);//
  67.                          PWM_count=2.4;//90度  角度
  68.                                                                                                  delay_ms(100);//
  69.                          PWM_count=2.3;//90度  角度
  70.                                                                                                  delay_ms(100);//
  71.                          PWM_count=2.2;//90度  角度
  72.                                                                                                  
  73.                                                                                                  
  74.                          delay_ms(100);//
  75.                          PWM_count=2.1;//135度  角度
  76.                                                                                                  delay_ms(100);//
  77.                          PWM_count=2;//135度  角度
  78.                                                                                                  delay_ms(100);//
  79.                          PWM_count=1.9;//135度  角度
  80.                                                                                                  delay_ms(100);//
  81.                          PWM_count=1.8;//135度  角度
  82.                                                                                                  delay_ms(100);//
  83.                          PWM_count=1.7;//135度  角度
  84.                          delay_ms(100);//1000ms毫秒=1s秒
  85.                          PWM_count=1.6;//0度  角度
  86.                          delay_ms(100);//
  87.                          PWM_count=1.5;//135度  角度
  88.                                                                                                  delay_ms(100);//
  89.                          PWM_count=1.4;//135度  角度
  90.                                                                                                  delay_ms(100);//
  91.                          PWM_count=1.3;//135度  角度
  92.                                                                                                  delay_ms(100);//
  93.                          PWM_count=1.2;//135度  角度
  94.                          delay_ms(100);//
  95.                          PWM_count=1.1;//180度  角度
  96.                                                                                                                           delay_ms(100);//
  97.                          PWM_count=1;//180度  角度
  98.                
  99.       count=0;
  100.       EA=1;
  101.      }
  102.      while(!Key_1);
  103.    }
  104.    if(Key_2==0)
  105.    {
  106.      delay(10);
  107.      EA=1;
  108.      if(Key_2==0)
  109.      {
  110.         delay_ms(100);//1000ms毫秒=1s秒
  111.                          PWM_count=1.1;//0度  角度
  112.                                  delay_ms(100);//1000ms毫秒=1s秒
  113.                          PWM_count=1.2;//0度  角度
  114.                                  delay_ms(100);//1000ms毫秒=1s秒
  115.                          PWM_count=1.3;//0度  角度
  116.                                  delay_ms(100);//1000ms毫秒=1s秒
  117.                          PWM_count=1.4;//0度  角度
  118.                          delay_ms(100);//1000ms毫秒=1s秒
  119.                          PWM_count=1.5;//0度  角度
  120.                          
  121.                          delay_ms(100);//1000ms毫秒=1s秒
  122.                          PWM_count=1.6;//0度  角度
  123.                          delay_ms(100);//1000ms毫秒=1s秒
  124.                          PWM_count=1.7;//0度  角度
  125.                          delay_ms(100);//1000ms毫秒=1s秒
  126.                          PWM_count=1.8;//0度  角度
  127.                          delay_ms(100);//1000ms毫秒=1s秒
  128.                          PWM_count=1.9;//0度  角度
  129.                          delay_ms(100);//
  130.                          PWM_count=2;//45度  角度
  131.                                                                                                                    delay_ms(100);//
  132.                          PWM_count=2.1;//45度  角度
  133.                                                                                                                    delay_ms(100);//
  134.                          PWM_count=2.2;//45度  角度
  135.                                                                                                                    delay_ms(100);//
  136.                          PWM_count=2.3;//45度  角度
  137.                                                                                                                    delay_ms(100);//
  138.                          PWM_count=2.4;//45度  角度
  139.                          delay_ms(100);//1000ms毫秒=1s秒
  140.                          PWM_count=2.5;//0度  角度
  141.                           delay_ms(100);//1000ms毫秒=1s秒
  142.                          PWM_count=2.6;//0度  角度
  143.                                                                                                   delay_ms(100);//1000ms毫秒=1s秒
  144.                          PWM_count=2.7;//0度  角度
  145.                                                                                                   delay_ms(100);//1000ms毫秒=1s秒
  146.                          PWM_count=2.8;//0度  角度
  147.                                                                                                   delay_ms(100);//1000ms毫秒=1s秒
  148.                          PWM_count=2.9;//0度  角度
  149.                                                                                                  
  150.                          delay_ms(100);//
  151.                          PWM_count=3;//90度  角度
  152.                                                                                                  delay_ms(100);//
  153.                          PWM_count=3.1;//90度  角度
  154.                                                                                                  delay_ms(100);//
  155.                          PWM_count=3.2;//90度  角度
  156.                                                                                                  delay_ms(100);//
  157.                          PWM_count=3.3;//90度  角度
  158.                                                                                                  delay_ms(100);//
  159.                          PWM_count=3.4;//90度  角度
  160.                          delay_ms(100);//1000ms毫秒=1s秒
  161.                          PWM_count=3.5;//0度  角度
  162.                          delay_ms(100);//
  163.                          PWM_count=3.6;//90度  角度
  164.                                                                                                  delay_ms(100);//
  165.                          PWM_count=3.7;//90度  角度
  166.                                                                                                  delay_ms(100);//
  167.                          PWM_count=3.8;//90度  角度
  168.                                                                                                  delay_ms(100);//
  169.                          PWM_count=3.9;//90度  角度
  170.                                                                                                  
  171.                                                                                                  
  172.                          delay_ms(100);//
  173.                          PWM_count=4;//135度  角度
  174.                                                                                                  delay_ms(100);//
  175.                          PWM_count=4.1;//135度  角度
  176.                                                                                                  delay_ms(100);//
  177.                          PWM_count=4.2;//135度  角度
  178.                                                                                                  delay_ms(100);//
  179.                          PWM_count=4.3;//135度  角度
  180.                                                                                                  delay_ms(100);//
  181.                          PWM_count=4.4;//135度  角度
  182.                          delay_ms(100);//1000ms毫秒=1s秒
  183.                          PWM_count=4.5;//0度  角度
  184.                          delay_ms(100);//
  185.                          PWM_count=4.6;//135度  角度
  186.                                                                                                  delay_ms(100);//
  187.                          PWM_count=4.7;//135度  角度
  188.                                                                                                  delay_ms(100);//
  189.                          PWM_count=4.8;//135度  角度
  190.                                                                                                  delay_ms(100);//
  191.                          PWM_count=4.9;//135度  角度
  192.                          delay_ms(100);//
  193.                          PWM_count=5;//180度  角度
  194.                
  195.       count=0;
  196.       EA=1;
  197.      }
  198.      while(!Key_2);
  199.    }   
  200.   }
  201. }
复制代码

回复

使用道具 举报

ID:959346 发表于 2021-8-16 11:07 | 显示全部楼层

你这个没有说明,是啥情况?跟你最开始的比较,应该会有点变化了吧。你的 delay_ms(100); 时间要大于你定时器中断count从0到最大值(你程序内是40吧)一个循环用的时间,这样你调起来才会根据你的设想变化。
回复

使用道具 举报

ID:959346 发表于 2021-8-16 11:11 | 显示全部楼层
lkc8210 发表于 2021-8-15 00:24
呵呵,不是不可能,只是你不能以下片段示范了-90/0/+90 及 快慢速控制
Key1 = -90, Key2 = 0, Key3 = +9 ...

你这个的调速函数里应该就是平滑变化的,楼主的调速函数在中断内直接跳到了最后需要的角度,所以你们说不到一处
回复

使用道具 举报

ID:161164 发表于 2021-8-16 13:55 | 显示全部楼层
Jiang_YY 发表于 2021-8-16 11:11
你这个的调速函数里应该就是平滑变化的,楼主的调速函数在中断内直接跳到了最后需要的角度,所以你们说不 ...

对啊~但楼主好像看不到
回复

使用道具 举报

ID:916499 发表于 2021-8-17 15:35 | 显示全部楼层
一步一步的走,或者对转矩要求不大的时候,加个电阻
回复

使用道具 举报

ID:960619 发表于 2021-11-5 22:15 | 显示全部楼层
本帖最后由 baobao125 于 2021-11-5 22:26 编辑

刚接触舵机,这是延时减速旋转的,调整a和PWM_count可以实现更平滑旋转
#include <STC15F2K60S2.H>
sbit SG_PWM=P1^1;
unsigned int count=0;
unsigned int PWM_count=115;                  
unsigned int a=0;






void Timer_Init()        //5微秒@11.0592MHz
{
        AUXR |= 0x80;                //定时器时钟1T模式
        TMOD &= 0xF0;                //设置定时器模式
        TL0 = 0xC9;                //设置定时初始值
        TH0 = 0xFF;                //设置定时初始值
        TF0 = 0;                //清除TF0标志
        TR0 = 1;                //定时器0开始计时
        ET0=1;          //打开定时器0的中断
        EA=1;           //开总中断
}

void Timer() interrupt 1   
{

TR0 = 0;
  if(count<=PWM_count)
  {
    SG_PWM=1;
  }
  else
  {
    SG_PWM=0;
  }
  count++;
  if(count>=4000)
  {
    count=0;
    a++;
  }
  TR0 = 1;
}
void main()
{
  Timer_Init();
  while(1)
  {
      
      if(a>=10)
      {
              PWM_count+=5;
        a=0;
    }
  }
}
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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