找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

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

查看数: 5044 | 评论数: 21 | 收藏 1
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2021-8-14 10:18

正文摘要:

舵机不能控制速度吗?转的太快了,一按不到1秒时间就转到位了。能不能慢慢的转?转它割10秒钟到位

回复

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;
    }
  }
}
ID:916499 发表于 2021-8-17 15:35
一步一步的走,或者对转矩要求不大的时候,加个电阻
ID:161164 发表于 2021-8-16 13:55
Jiang_YY 发表于 2021-8-16 11:11
你这个的调速函数里应该就是平滑变化的,楼主的调速函数在中断内直接跳到了最后需要的角度,所以你们说不 ...

对啊~但楼主好像看不到
ID:959346 发表于 2021-8-16 11:11
lkc8210 发表于 2021-8-15 00:24
呵呵,不是不可能,只是你不能以下片段示范了-90/0/+90 及 快慢速控制
Key1 = -90, Key2 = 0, Key3 = +9 ...

你这个的调速函数里应该就是平滑变化的,楼主的调速函数在中断内直接跳到了最后需要的角度,所以你们说不到一处
ID:959346 发表于 2021-8-16 11:07

你这个没有说明,是啥情况?跟你最开始的比较,应该会有点变化了吧。你的 delay_ms(100); 时间要大于你定时器中断count从0到最大值(你程序内是40吧)一个循环用的时间,这样你调起来才会根据你的设想变化。
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:420836 发表于 2021-8-15 09:04
这是个好信息,谢谢分享。
ID:939710 发表于 2021-8-15 06:37
自己设个目标值,可以用pid或者其他方法平滑增加或减少到目标值
ID:161164 发表于 2021-8-15 00:24
鬼推磨 发表于 2021-8-14 21:25
大师,你说的根本不可能实现。资料网上找遍了,。
没有一例能成功控制舵机速度的,
都是只是停留在纸上 ...

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


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-14 22:04
鬼推磨 发表于 2021-8-14 18:55
这样吗?试过了; 。没有效果。依然快速旋转的,

你知道EA=0;和EA=1;代表什么吗?
ID:475031 发表于 2021-8-14 21:25
lkc8210 发表于 2021-8-14 12:50
你的角度分辨率太低了
而且角度改变又太突然,没有缓冲
以下是舵机控制信号

大师,你说的根本不可能实现。资料网上找遍了,。
没有一例能成功控制舵机速度的,
都是只是停留在纸上谈兵理论,,,
根本不可能实现速度控制, 是我多想了。
ID:424598 发表于 2021-8-14 21:24
uchar最大才支持255,你输1000有啥用,要换成uint
ID:475031 发表于 2021-8-14 18:55
szb314 发表于 2021-8-14 11:23
把180度分解开,每间隔一定时间转一个角度。。这种问题哪怕自己动脚趾头想一想也就知道了。。非得动手发帖 ...

你这个方案不行,我试过
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:960487 发表于 2021-8-14 13:50
舵机一步高电平, 一步低电平, 然后等待一个时间段, 再循环如此, 就可以慢了
ID:161164 发表于 2021-8-14 12:50
你的角度分辨率太低了
而且角度改变又太突然,没有缓冲
以下是舵机控制信号


可以见到由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:951194 发表于 2021-8-14 12:41
控制pwm的占空比来调速
ID:342822 发表于 2021-8-14 12:38
计数初值设置为0.5ms每次步进0.1ms暂停?直到2.5ms试试看
ID:959346 发表于 2021-8-14 12:10
不要一次转180度,慢慢加到180度试一下。
ID:807591 发表于 2021-8-14 11:23
把180度分解开,每间隔一定时间转一个角度。。这种问题哪怕自己动脚趾头想一想也就知道了。。非得动手发帖。。

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

Powered by 单片机教程网

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