本帖最后由 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; } } } |
一步一步的走,或者对转矩要求不大的时候,加个电阻 |
Jiang_YY 发表于 2021-8-16 11:11 对啊~但楼主好像看不到 |
lkc8210 发表于 2021-8-15 00:24 你这个的调速函数里应该就是平滑变化的,楼主的调速函数在中断内直接跳到了最后需要的角度,所以你们说不到一处 ![]() |
你这个没有说明,是啥情况?跟你最开始的比较,应该会有点变化了吧。你的 delay_ms(100); 时间要大于你定时器中断count从0到最大值(你程序内是40吧)一个循环用的时间,这样你调起来才会根据你的设想变化。 |
Jiang_YY 发表于 2021-8-14 22:39
|
这是个好信息,谢谢分享。 |
自己设个目标值,可以用pid或者其他方法平滑增加或减少到目标值 |
鬼推磨 发表于 2021-8-14 21:25 呵呵,不是不可能,只是你不能以下片段示范了-90/0/+90 及 快慢速控制 Key1 = -90, Key2 = 0, Key3 = +90, Key4 = 快慢速 示波器显示了PWM转换速度 ![]() |
鬼推磨 发表于 2021-8-14 18:55 你在开始的时候EA=0; 都不进中断了,一直到 EA=1; 之前,这段时间都没有进中断,舵机都没有操作,直到EA=1; 开中断后,舵机才开始操作,这时候你的角度已经是直接到最后的角度了,中间的操作根本没有起到作用。你先把EA=0 改成 EA=1; 简单点看看效果,再自己细调吧。 |
鬼推磨 发表于 2021-8-14 18:55 你知道EA=0;和EA=1;代表什么吗? |
lkc8210 发表于 2021-8-14 12:50 大师,你说的根本不可能实现。资料网上找遍了,。 没有一例能成功控制舵机速度的, 都是只是停留在纸上谈兵理论,,, 根本不可能实现速度控制, 是我多想了。 |
uchar最大才支持255,你输1000有啥用,要换成uint |
szb314 发表于 2021-8-14 11:23 你这个方案不行,我试过 ![]() |
Jiang_YY 发表于 2021-8-14 12:10
|
舵机一步高电平, 一步低电平, 然后等待一个时间段, 再循环如此, 就可以慢了 |
你的角度分辨率太低了 而且角度改变又太突然,没有缓冲 以下是舵机控制信号 ![]() 可以见到由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的更新速度就是转动速度 |
控制pwm的占空比来调速 |
计数初值设置为0.5ms每次步进0.1ms暂停?直到2.5ms试试看 |
不要一次转180度,慢慢加到180度试一下。 |
把180度分解开,每间隔一定时间转一个角度。。这种问题哪怕自己动脚趾头想一想也就知道了。。非得动手发帖。。![]() |