作者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
1F:推 deo2000:对,我搞错了,最低资讯量不是^2,是*2,因一次只能跑一个方向 08/13 03:40
2F:→ deo2000:想不到这麽困难的东西大家都直接给code啊 (惊) 08/13 03:41
因为要解释做法很累,乾脆直接放code,不去研究怎样做,那些code就
跟废物一下。而且也不是啥困难的东西,那是我以前大二写的东西。现
在也不用8051了。
3F:推 WolfLord:因为看你很勤劳啊~ 不过说真的,觉得你要好好把CODE看懂 08/13 04:11
4F:→ WolfLord:喝汤囫囵吞很容易烫到喔 :P 08/13 04:12
5F:推 Deltaguita:只要不是伸手牌 这里很多很厉害的前辈在分享自己的经 08/13 11:22
6F:→ Deltaguita:验 收获良多 08/13 11:23
※ 编辑: MasterChang 来自: 118.232.32.206 (08/13 23:02)
7F:推 ksmrt0123:其实原po没算错, 只是"资讯量"这词容易误解. 08/13 23:39
8F:→ ksmrt0123:每颗马达需要 (方向2) x (pwm 100)种状态, 08/13 23:40
9F:→ ksmrt0123:两颗独立就是 (2x100)^2 种状态, 08/13 23:41
10F:→ ksmrt0123:故需要40K个数值才能表示所有状态, 可编进2 bytes. 08/13 23:41
查表?
到现在还不知道原PO的PWM频率多高?XD
11F:→ ksmrt0123:40K只是计算最少需要的状态(数值), 不代表要编成 08/14 00:06
12F:→ ksmrt0123:0-399999 08/14 00:07
※ 编辑: MasterChang 来自: 118.232.32.206 (08/14 00:11)
13F:推 ksmrt0123:看原po最早的程式似乎是想要10K @ 10 steps... 08/14 00:15
14F:→ ksmrt0123:不过这用11.0592MHz的标准51应该是做不到 08/14 00:15
XD 我是 WolfLord 讲得那种死硬派,只要跟演算法核心无关得我只
想用硬体搞定。~_~
※ 编辑: MasterChang 来自: 118.232.32.206 (08/14 00:24)
15F:推 WolfLord:他想用11.0592做出10uS/100Steps*8CH 的PWM,然後还要 08/14 00:30
16F:推 ksmrt0123:PWM硬体很多了, PIC的ECCP, STM32的TIM都很方便 08/14 00:30
17F:→ WolfLord:可以用serial来通讯、改变各ch的数值。其实我算一算也不 08/14 00:31
18F:→ WolfLord:是不能做出来,只是写范例太花工,要解释清楚更花功 XD 08/14 00:32