作者deo2000 (800IM)
看板ASM
标题[问题] 被RI中断之後就不去main的回圈了
时间Sat Aug 4 22:45:02 2012
测试了一整个晚上
想要用 UART 动态改变 PWM 值,
PWM 值 是由 Timer loop 中读取 Pin 0~3 所决定 (存放在PWM_Pin[])
UART 要传入新 PWM 值的时候会由 RI 中断,
但是不知道怎麽搞得,一被 RI 中断,就再也回不去 main loop 了
我不知道 uVision 怎麽像 MSVC 一步一步地的看变数 debug,
只能从硬体动作推测程式码实际动作
code在此
http://pastie.org/4389549
拜托各位了... Orz
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.122.167.217
1F:→ lion21:1.你怎会开IE0中断?2.T1执行周期太短.小於PWM副程式时间 08/04 23:00
IE=0x92=1001,1010(Bin) IE.0是停用的
※ 编辑: deo2000 来自: 140.122.167.217 (08/05 02:53)
把 PWM_PerCycle() 改写成 Timer0 的中断副程式,而不用垂询,就可用UART控制Duty了
http://pastie.org/4391162
但还是有个不懂的地方.这个新程式输出 PWM 周期应该是
10us中断一次*10解析度=100us(Rx都没收到东西的话)
f应该是10kHz,但是实际上看电路动作,目测大约10Hz,
马达整个抖得很厉害,直流马达跑得像步进马达一样,是哪里出问题呢?
※ 编辑: deo2000 来自: 140.122.167.217 (08/05 06:13)
2F:→ lion21:IE0是我看错.但是 0x92的bin应该是 1001-0010 08/05 15:40
3F:→ lion21:&& buf<=0x39 .&& buf<=0x46 好像是多余的 08/05 15:44
4F:→ lion21:buf 的计算很诡异 08/05 15:45
5F:→ lion21:0x30<=buf 应该是 >= 08/05 15:46
6F:→ lion21:重点应该是 10us中断一次 太短.你的中断程式一定超过10us 08/05 15:47
请问执行时间怎麽看呢?
是翻译成组合语言後,对照原厂规格,每个指令需要1或2个机器周期吗?
※ 编辑: deo2000 来自: 140.122.167.217 (08/05 17:20)
7F:推 lion21:你说的是一种方法.我都是用示波器看. 08/05 17:23
8F:→ lion21:其实你大约算看看就知道了. 08/05 17:23
9F:推 WolfLord:8051在11.059MHZ下10uS只有9个M Cycle,扣掉中断的两个周 08/05 23:32
10F:→ WolfLord:期以及反还的2个周期你只剩五个一周指令可以用喔 08/05 23:33
11F:推 WolfLord:1.马达对於频率反应并不快,你不需要这麽高的频率 08/06 07:45
12F:→ WolfLord:2.你不可以用TA7279AP来驱动,因为认一端截止都会变成 08/06 07:46
13F:→ WolfLord:电磁煞车(只要你关闭马达,包括PWM讯号的OFF)你发抖的 08/06 07:46
14F:→ WolfLord:原因是因为你的PWM变成电磁煞车。改用L298,把PWM接到 08/06 07:47
15F:→ WolfLord:EN 讯号去。然後停车时PWM为FULL(电磁煞车) 08/06 07:48
16F:→ WolfLord: 任一端截止 08/06 07:49
17F:推 WolfLord:3.建议时钟改22.1184,然後TH0改成0x80 08/06 07:52
18F:→ WolfLord:4.SERIAL(232)不要用中断(会撞到T0)用MAIN LOOP 08/06 07:53
TA7279AP 要两个输入都 Hi 才会变成煞车,其他三个状态是 正 反 空档
目前测试结果,TA7279AP的确对PWM会有响应.
目前遇到最大的问题是:不管怎麽写,写出来的 PWM 频率总是比理论上低很多
例如 200uS中断一次*100解析度=20mS一周,但实际上一周却有好几秒
而且,把 PWM 中断函式 的计时从 1~256uS 发现输出都差不多,大约10Hz;
但是单独用 Timer 中断写一个 LED 闪烁程式却没错误.
我观察到的抖动原因,认为是频率过低,而不是煞车;
因为我同时把讯号输出到 P0 和 P1,一个马达,另一个LED,
从 LED 观测讯号可以避掉马达的一些效应.
至於你建议的方法1.3.4.我会试看看
最近为了这个身心俱疲,找了一堆书,发现写的应用例子都差不多,而且PWM部分很浅
※ 编辑: deo2000 来自: 140.122.167.217 (08/06 08:41)
19F:→ WolfLord:TA7279 没有高阻抗状态,不管你拉LOW或HIGH只要两端一样 08/06 08:39
20F:→ WolfLord:都是电磁煞车状态 08/06 08:39
刚刚看datasheet确认是有
http://pdf1.alldatasheet.com/datasheet-pdf/view/31270/TOSHIBA/TA7279AP.html
page 4
※ 编辑: deo2000 来自: 140.122.167.217 (08/06 08:44)
21F:推 WolfLord:那你就继续用吧,不过你如果坚持要用TA7279你就得继续跟 08/06 08:48
22F:→ WolfLord:MCU的指令速度跟频率格斗,而且也没办法使用硬体PWM 08/06 08:49
照你说的,拿掉 interrupt 4 之後,预期的频率就出来了!
※ 编辑: deo2000 来自: 140.122.167.217 (08/06 08:52)
23F:推 WolfLord:@所以,结果就是你中断打架,彼此吃掉对方的CPU周期嘛 08/06 08:55
24F:→ WolfLord:你要使用TA7279你的中断内IO动作就多,不要期待频率太高 08/06 08:57
25F:→ WolfLord:不然CPU跑不完中断你就等着堆叠大错乱 XDD 08/06 08:57
26F:推 Deltaguita:怕中断打架的话 可以考虑硬体PWM的MCU 08/06 09:02
27F:推 lion21:如果你坚持目前架构.问题就在你的中断副程式太肥了 08/06 10:14
28F:推 WolfLord:他的硬体架构要用硬体PWM恐怕问题还很大哩 :P 08/06 17:44
刚刚看 datasheet,L298似乎逻辑较简单,对PWM响应会比较好?
※ 编辑: deo2000 来自: 140.122.167.217 (08/06 18:22)
29F:推 WolfLord:因为他可以PWM是PWM,方向是方向。所以你产生PWM的中断 08/06 20:48
30F:→ WolfLord:函式就可以精简。中断函式精简你就比较不用跟CPU的指令 08/06 20:49
31F:→ WolfLord:周期葛葛缠,剪不断理还乱。而且L298还有提供过载检知, 08/06 20:51
32F:→ WolfLord:你的驱动电路可以简单的做得更完善。 08/06 20:51
33F:推 WolfLord:你想用硬体PWM,硬体的PWM也是单独输出,你方向跟PWM还得 08/06 20:54
34F:→ WolfLord:做外部电路整合,单靠TA7279你是无法整合硬体PWM产生器的 08/06 20:55
35F:推 ksmrt0123:TA7279比L298简单也更适合PWM, 只是power小 08/06 23:55
Power小没关系,负载只有webcam.
可以问一下,为什麽更适合PWM呢? 我看TA7279的 input 到 H-桥 中间还有一块未知电路
36F:→ WolfLord:你要靠不段变换输出状态吗? 还是外接一个电源控制晶体? 08/07 00:14
本来有想过用PWM接 P-MOS 或 PNP,但是觉得这样电路会太复杂
※ 编辑: deo2000 来自: 140.122.167.217 (08/07 01:56)
37F:推 WolfLord:不管你要接PN晶体来世MOS,从+端控制只要马达跟逻辑电压 08/07 02:35
38F:→ WolfLord:不一样,LEVEL SHIFT都不会是太简单的电路(要懂类比) 08/07 02:36
39F:→ WolfLord: 还是 08/07 02:36
40F:→ WolfLord:所以我还是觉得L298比较好用 ^.^ 08/07 02:37
41F:推 ksmrt0123:TA7279AP因为有高阻抗状态比较适合PWM控制 08/07 09:32
42F:推 WolfLord:把L298的EN拉道地现她就自然高阻抗了,要PWM直接送EN就好 08/07 15:07
43F:→ WolfLord:了,你用TA7279你还要花中断内CPU时间改变两个输出状态 08/07 15:08
44F:→ WolfLord:而且为了等一下要还原你还得保存刚刚的状态。这对於CPU 08/07 15:09
45F:→ WolfLord:TIME不高的标准51哪里占优势了? 08/07 15:09
46F:→ WolfLord: 拉到地线 08/07 15:10
47F:→ WolfLord:然後你不满意还可以从L298的ISENSE(电流监测脚)对它进 08/07 15:12
48F:→ WolfLord:行外加一个MOS或NPN晶体的CE PWM控制。我怎麽觉得日本IC 08/07 15:13
49F:→ WolfLord:设计用途根本就不是给你这样用的? 08/07 15:13
50F:→ ksmrt0123:两组pwm输出到in1/in2不就好了? 且这样只需2 pins 08/07 23:18
51F:→ ksmrt0123:现在很多mcu都有多组pwm输出 用fw写pwm也不见得差很多 08/07 23:19
52F:推 WolfLord:你硬体PWM输出如果不经过组合怎麽接上TA7279 ? 08/08 03:36
53F:→ WolfLord: 外部组合电路 08/08 03:37
54F:→ WolfLord:然後两组硬体PWM对应一个IO 这样算是比较优吗? 08/08 03:39
55F:推 ksmrt0123:pwm1->in1, pwm2->in2, 然後控制两组pwm的duty cycle 08/08 09:58
56F:→ ksmrt0123:就可做出对brushed dc motor的所有动作 08/08 09:59
57F:→ deo2000:我不是用BLDC,控制的目标是两颗减速有刷DCM 08/08 10:30
58F:→ ksmrt0123:brush=电刷, brushED=有刷, brushLESS才是无刷 08/08 19:19
59F:推 WolfLord:不跟你争辩了,反正哪个好用大家冷暖自知 XD 08/08 19:24
60F:→ deo2000:抱歉看错..看成brushless 08/08 21:11