作者MasterChang (我愛ASM)
看板ASM
標題Re: [問題] PC經UART傳4組PWM數值給51
時間Sun Aug 12 14:12:59 2012
※ 引述《deo2000 (800IM)》之銘言:
: 如標題
: 之前的控制,我一次都只傳一個字元,所以沒什麼問題。
: 但是現在控制目標不僅僅只於馬達運動方向了,還多了 PWM。
: 上下左右解析度都 100 的話,資訊量就暴增到 (100+100)^2=40k
馬達運動方向 1 bit,PWM資訊 1 byte.
如果你的馬達有兩顆,也不過 3 bytes,哪來的 40K ?
如果傳輸的資料 <header> <datas> <check sum>
1byte 3bytes 1byte
也不過5 bytes
: 已經非 ASCII 一個字 0~255 可以容納。
: 但是我這幾天實作 PC 送字串給 51 一直出問題,
: 先從兩個字開始做起。
: 雖然很多高手熱心幫忙解答,但在這個關鍵上都沒有改善,弄得焦頭爛額了。
: 目前 4 組 PWM 控制的實驗,若不是要靠重新燒錄改值,就是要靠 51 的 IO set,
: 實在是找不到一個可以用 PC 一次傳送這麼大量資訊的辦法。
: 是否有板友做過類似的東西,可以提供樣板或經驗呢?謝謝
BYTE data Current_State = FSM_INIT;
#define SYNC 0x40 //Guide Char '@'
BYTE data ANG_Itor;
BYTE data PWM_ANGLE[4];
BYTE data PWM_ID;
WORD data PWM_Count[4];
void ISR_Serial() interrupt Serial_ISR
{
BYTE data ch;
if(_testbit_(TI))
{
}
if(_testbit_(RI))
{
if(!Flag.rx)//Do nothing if the command not be excuted before.
{
ch = SBUF;
switch(Current_State)
{
case FSM_INIT:
if(ch == SYNC)
{
Current_State = FSM_ADDRESS;
SBUF = ch;
}
break;
case FSM_ADDRESS:
if(isalpha(ch))
{
PWM_ID = ch;
Current_State = FSM_ANGLE;
SBUF = ch;
}
break;
case FSM_ANGLE:
if(isdigit(ch))
{
PWM_ANGLE[ANG_Itor] = ch;
SBUF = ch;
++ANG_Itor;
if(ANG_Itor > 2)
{
PWM_ANGLE[ANG_Itor]=0;
ANG_Itor = 0;
Current_State = FSM_END;
}
}
if(ch == 0x0D)
{
Current_State = FSM_INIT;
PWM_ANGLE[ANG_Itor] = 0;
SBUF = ch;
ANG_Itor = 0;
Flag.rx=1;
}
break;
case FSM_END:
if(ch == 0x0D)
{
Current_State = FSM_INIT;
SBUF = ch;
ANG_Itor = 0;
Flag.rx=1;
}
break;
default: //Reset FSM
Flag.rx=0;
Current_State = FSM_INIT;
ANG_Itor = 0;
break;
}
}
}
}
--
不要問我從哪來,我只是一個浪跡天涯的工程師....
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 118.232.32.206
推 deo2000:對,我搞錯了,最低資訊量不是^2,是*2,因一次只能跑一個方向 08/13 03:40
→ deo2000:想不到這麼困難的東西大家都直接給code啊 (驚) 08/13 03:41
因為要解釋做法很累,乾脆直接放code,不去研究怎樣做,那些code就
跟廢物一下。而且也不是啥困難的東西,那是我以前大二寫的東西。現
在也不用8051了。
推 WolfLord:因為看你很勤勞啊~ 不過說真的,覺得你要好好把CODE看懂 08/13 04:11
→ WolfLord:喝湯囫圇吞很容易燙到喔 :P 08/13 04:12
推 Deltaguita:只要不是伸手牌 這裡很多很厲害的前輩在分享自己的經 08/13 11:22
→ Deltaguita:驗 收穫良多 08/13 11:23
※ 編輯: MasterChang 來自: 118.232.32.206 (08/13 23:02)
推 ksmrt0123:其實原po沒算錯, 只是"資訊量"這詞容易誤解. 08/13 23:39
→ ksmrt0123:每顆馬達需要 (方向2) x (pwm 100)種狀態, 08/13 23:40
→ ksmrt0123:兩顆獨立就是 (2x100)^2 種狀態, 08/13 23:41
→ ksmrt0123:故需要40K個數值才能表示所有狀態, 可編進2 bytes. 08/13 23:41
查表?
到現在還不知道原PO的PWM頻率多高?XD
→ ksmrt0123:40K只是計算最少需要的狀態(數值), 不代表要編成 08/14 00:06
→ ksmrt0123:0-399999 08/14 00:07
※ 編輯: MasterChang 來自: 118.232.32.206 (08/14 00:11)
推 ksmrt0123:看原po最早的程式似乎是想要10K @ 10 steps... 08/14 00:15
→ ksmrt0123:不過這用11.0592MHz的標準51應該是做不到 08/14 00:15
XD 我是 WolfLord 講得那種死硬派,只要跟演算法核心無關得我只
想用硬體搞定。~_~
※ 編輯: MasterChang 來自: 118.232.32.206 (08/14 00:24)
推 WolfLord:他想用11.0592做出10uS/100Steps*8CH 的PWM,然後還要 08/14 00:30
推 ksmrt0123:PWM硬體很多了, PIC的ECCP, STM32的TIM都很方便 08/14 00:30
→ WolfLord:可以用serial來通訊、改變各ch的數值。其實我算一算也不 08/14 00:31
→ WolfLord:是不能做出來,只是寫範例太花工,要解釋清楚更花功 XD 08/14 00:32