发新帖我要提问
123
返回列表
打印

串口接收引起的模拟PWM调光闪烁,请高手帮帮忙

[复制链接]
楼主: xiaomuhong26
手机看帖
扫描二维码
随时随地手机跟帖
41
223178825| | 2010-11-9 22:18 | 只看该作者 回帖奖励 |倒序浏览
学习了

使用特权

评论回复
42
sxhhhjicbb| | 2010-11-9 23:11 | 只看该作者
你可以打开单片机的串口,但是关掉串口的接收中断。在PWM中断程序去采样UART接收到的数据。有一个是最后更新的数据。当然。这样你的控制协议只能有一个字节了。

使用特权

评论回复
43
sxhhhjicbb| | 2010-11-9 23:15 | 只看该作者
另一种方法是UART串口接收中断采用汇编语言写。不要采用C语言的上下文保护。只要三个指令周期就可以读出UART接收到的数据。而且在PWM空闲的时候打开UART的中断。这样,UART的中断处理就会干扰最少。

使用特权

评论回复
44
ewq_022| | 2010-11-10 09:09 | 只看该作者
要不你试试把定时器中断函数中只做count++.  其他的语句都放到主函数的循环中,

使用特权

评论回复
45
wuyb0512| | 2010-11-10 09:16 | 只看该作者
首先你的串口是250K,也就是说接收一位的时间是4us,来一个8位数据就要中断一次,那么中断时间为32us。也就是说:每隔32us时间就要处理接收数据,哪还有时间去执行其它PWM的中断呢?

使用特权

评论回复
46
rockkane7| | 2010-11-10 09:44 | 只看该作者
你的闪烁应该是由于串口的中断时间过长使PWM占空比不稳定导致的
你可以这样考虑下,在串口的中断里,你只定义一个标志位就马上跳出来,然后在一个PWM定时中断完了之后再根据这个标志位来进行相应的处理,这样就只是增加一点处理延时而已,而且45楼理论上说的没错,但是发收端不太可能做到几十个US就发送一次,毕竟是人在操作。如果你实在怕这个延时过长,你还可以将你的PWM中断程序也做相应的处理,就是向44楼说的,只做计数,同样定义一个标志位,出来后根据这个标志位再做相应的处理,当然这个定时中断时越短越好,总之就是尽量将程序放在主分支里跑。

使用特权

评论回复
47
xiaomuhong26|  楼主 | 2010-11-10 10:56 | 只看该作者
多谢各位大侠的指点,现在正在测试中,我现在是在单片机A(250Kbit/s波特率)发送数据时,先进行计数,当计数到一定值后,才发送一个数据,这样的话,在单片机B接收函数中,就不会被接收中断不断触发了(因为计数相当于发送单片机A发送时加入了延时),在这个空闲时间内,我就可以进行PWM处理了,而且经测试后,己经不闪烁了,发送数据也正常,我想请问各位大侠,是不是我说的那个延时给了PWM处理时间,才能够这样正常地工作?是这个原因吗?

使用特权

评论回复
48
DavidFang| | 2010-12-20 15:25 | 只看该作者
事情处理了吗?

使用特权

评论回复
49
zhaochong| | 2016-5-17 19:17 | 只看该作者
能否看一下程序

使用特权

评论回复
50
zhxzhxzzhhxx| | 2016-5-23 01:56 | 只看该作者
实际和通讯没有关系,通讯那点延时根本看不出来,你的问题是PWM的数据不能立刻更新,要在一个PWM周期完成的时候更新.

使用特权

评论回复
51
tianqi911| | 2019-10-29 16:43 | 只看该作者
MARK .鄙人也碰到此问题。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则