|
|
本帖最后由 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度分解開,每間隔一定時間轉一個角度。。這種問題哪怕自己動腳趾頭想一想也就知道了。。非得動手發帖。。![]() |