Re: [問題] PC經UART傳4組PWM數值給51

看板ASM (組合語言)作者 (我愛ASM)時間12年前 (2012/08/12 14:13), 編輯推噓7(7011)
留言18則, 4人參與, 最新討論串2/3 (看更多)
※ 引述《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

08/13 03:40, , 1F
對,我搞錯了,最低資訊量不是^2,是*2,因一次只能跑一個方向
08/13 03:40, 1F

08/13 03:41, , 2F
想不到這麼困難的東西大家都直接給code啊 (驚)
08/13 03:41, 2F
因為要解釋做法很累,乾脆直接放code,不去研究怎樣做,那些code就 跟廢物一下。而且也不是啥困難的東西,那是我以前大二寫的東西。現 在也不用8051了。

08/13 04:11, , 3F
因為看你很勤勞啊~ 不過說真的,覺得你要好好把CODE看懂
08/13 04:11, 3F

08/13 04:12, , 4F
喝湯囫圇吞很容易燙到喔 :P
08/13 04:12, 4F

08/13 11:22, , 5F
只要不是伸手牌 這裡很多很厲害的前輩在分享自己的經
08/13 11:22, 5F

08/13 11:23, , 6F
驗 收穫良多
08/13 11:23, 6F
※ 編輯: MasterChang 來自: 118.232.32.206 (08/13 23:02)

08/13 23:39, , 7F
其實原po沒算錯, 只是"資訊量"這詞容易誤解.
08/13 23:39, 7F

08/13 23:40, , 8F
每顆馬達需要 (方向2) x (pwm 100)種狀態,
08/13 23:40, 8F

08/13 23:41, , 9F
兩顆獨立就是 (2x100)^2 種狀態,
08/13 23:41, 9F

08/13 23:41, , 10F
故需要40K個數值才能表示所有狀態, 可編進2 bytes.
08/13 23:41, 10F
查表? 到現在還不知道原PO的PWM頻率多高?XD

08/14 00:06, , 11F
40K只是計算最少需要的狀態(數值), 不代表要編成
08/14 00:06, 11F

08/14 00:07, , 12F
0-399999
08/14 00:07, 12F
※ 編輯: MasterChang 來自: 118.232.32.206 (08/14 00:11)

08/14 00:15, , 13F
看原po最早的程式似乎是想要10K @ 10 steps...
08/14 00:15, 13F

08/14 00:15, , 14F
不過這用11.0592MHz的標準51應該是做不到
08/14 00:15, 14F
XD 我是 WolfLord 講得那種死硬派,只要跟演算法核心無關得我只 想用硬體搞定。~_~ ※ 編輯: MasterChang 來自: 118.232.32.206 (08/14 00:24)

08/14 00:30, , 15F
他想用11.0592做出10uS/100Steps*8CH 的PWM,然後還要
08/14 00:30, 15F

08/14 00:30, , 16F
PWM硬體很多了, PIC的ECCP, STM32的TIM都很方便
08/14 00:30, 16F

08/14 00:31, , 17F
可以用serial來通訊、改變各ch的數值。其實我算一算也不
08/14 00:31, 17F

08/14 00:32, , 18F
是不能做出來,只是寫範例太花工,要解釋清楚更花功 XD
08/14 00:32, 18F
文章代碼(AID): #1G9qbki0 (ASM)
討論串 (同標題文章)
文章代碼(AID): #1G9qbki0 (ASM)