使用Ai8051U实现4路1MHz可控数量脉冲输出,工控领域
请注意,本方案目前未经实际验证,待国庆节后验证一下之前,使用过 32G12K128 控制过外部的伺服控制器,但总是面临一个问题,脉冲速度慢了影响速度不行,改变伺服控制器端的虚拟齿轮比又会导致精度下降一些。虽然说也能用,但总归不是两全其美的感觉。
后来,想过使用pwm的重复计数器,但是发现这并不能做到四路输出完全的周期和数量可控。而使用pwm单脉冲模式则是通过频繁进入中断进行重载功能,显然是不大能完成高速可控的脉冲输出。
而我看论坛上常见的实现方式则是通过直接使用定时器进行输出,但是这样就有点浪费定时器资源的感觉,并且输出端口固定是那几个。
所以我这里给出一种理论上可行的方案:使用串口DMA完成可控脉冲数量输出。
首先我们需要了解到,高速输出下,发出去的脉冲只需要符合差不多是方波即可,并不需要严格的平均间隔控制,所以呢。我们通过使用串口协议的方式,完成近似的方波输出。
我们来看一帧串口数据包含哪些部分。
首先是不可控的部分,串口空闲状态为高电平,并且起始位为1位低电平,停止位为1位高电平。可控的部分则是中间的8位数据电平。
这里将起始位和停止位一起计入,数据为0x00时的二进制数据则为
0000000001
那么,如果将这个数据为进行一定的变化,比如下面这个表
串口数据 等效二进制编码 等效脉冲个数
0xff 0111111111 1个脉冲
0xfd 0101111111 2个脉冲
0xf5 0101011111 3个脉冲
0xd5 0101010111 4个脉冲
0x55 1010101010 5个脉冲
这样,拥有了从1~5的脉冲生成能力,即可通过给xdata区域填入合适的数据,即可实现可控的脉冲数量高速输出。
并且,高速的脉冲输出并不需要每次输出就变化一次脉冲的周期,而仅仅是需要不算很高速度的变化以完成线性加减速或者s形加减速。所以,我们可以让串口dma填入指定数量的数据,从而完成一批数据的发送。
那么,这一批脉冲的周期又该如何控制呢?得益于8051u单片机新增的dma_itv寄存器,可以控制dma每次发送或者接受数据的间隔(最大65535个系统时钟),这样以40mhz主频来看,串口开到1mhz到1khz都毫无压力,并且,小于1k的情况,还可以通过拉开dma发送之间的延时,并且发送一个脉冲(0xff),来继续降低速度。
最重要的是,每个串口的itv寄存器都是独立可调的。这样,所有穿扣扣可以共用一个定时器2,从而完成低占用。并且串口也是可以随便分配的,比如用一个串口,那就三轴高速输出。并且使用高速输出的串口的输入仍然可用。同时,串口可以切换的引脚也很多。
如果并非同时输出脉冲,可以输出完成一串脉冲后切换引脚进行其他脉冲输出。
从执行特点来讲就是两个电机被物理互锁了,一个动另一个就不能动了。
这部分想法我会在国庆节后进行验证,因为现在回家了,没带电脑。
说句题外话,UART串口数据是LSB在前。
即0xAA加上起始位停止位是0010101011,不是0101010101。 health 发表于 2024-9-29 22:01
说句题外话,UART串口数据是LSB在前。
即0xAA加上起始位停止位是0010101011,不是0101010101。 ...
这确实是我的疏忽了,不过从理论上来讲,这个方式是可以输出高速脉冲的
我马上修改一下 对于脉冲输出的应用,还是使用PWM相对来说更实用一些,主要是输出频率或者说周期比较稳定,串口输出脉冲则有宽有窄,一定程度上限制了应用。 晓飛飛 发表于 2024-9-30 01:15
对于脉冲输出的应用,还是使用PWM相对来说更实用一些,主要是输出频率或者说周期比较稳定,串口输出脉冲则 ...
这个也算是一种思路吧。
具体还是要看测试效果,而且pwm不同周期的输出不能太快了,中断会比较频繁 图样图森破, 楼主的想法很好,我以前就用过SPI输出脉冲的应用,但是用pwm可能更好一些 {:4_250:} 期待楼主验证想法!! 社区闲人 发表于 2024-9-30 06:42
图样图森破,
此句精辟,敢问出自何处?
页:
[1]
2