打印
[技术问答]

用新唐NUC123做了12路方波输出,求更好方案推荐

[复制链接]
1073|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Metalor|  楼主 | 2017-6-27 11:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

需求:MCU出12路频率不同且可调的方波,范围500Hz-3KHz。

目前暂用新唐NUC123的一个24位定时器计数,通过判断计数值和相应12个频率对应的分频表比较,符合条件的就翻转对应的Pin脚,然后再更新分频表以便下一次翻转。另一个计数器定时1ms做电位器ADC采样来调节频率。整个系统无中断(进出中断很耗时间),只在main里判断相应的寄存器状态。(感觉比较难表达,没看明白的忽略这段直接从需求入手吧……)
这个方法可以想象肯定效果不会好,目前2K频率处误差大概+/-10Hz。
进一步优化后用MCU自带的四路PWM做其中四个输出,另外八个IO继续沿用之前的方法。PWM输出频率当然无误差,非常准,CPU负担减轻另外8个输出准度也有改善,但无法做得更好了。

求助:
1. 在以上基础上是否还有更好的优化方案(具体实现的算法上自认为已经基本没有优化空间了)?
2. 求推荐更好的实现方案。如果有能输出12路PWM的MCU推荐最好(能有10路基本也可以),找了半天没找到合适的,要求能独立调节每一路PWM频率(很多标称12路24路的并不能独立调节每一路的频率),占空比不需要调保持50%就好。

希望有高人解答,感谢!
沙发
Metalor|  楼主 | 2017-6-28 08:31 | 只看该作者

使用特权

评论回复
板凳
huangcunxiake| | 2017-6-28 09:26 | 只看该作者
方波直接定时器加io

使用特权

评论回复
地板
Metalor|  楼主 | 2017-6-28 11:54 | 只看该作者
huangcunxiake 发表于 2017-6-28 09:26
方波直接定时器加io

一两路应该可以这么做,12路不行吧?

使用特权

评论回复
5
天灵灵地灵灵| | 2017-6-29 09:58 | 只看该作者
方波,这么多路,除了那个IO,真是找不到东西了。

使用特权

评论回复
6
捉虫天师| | 2017-6-29 10:00 | 只看该作者
谁有大量方波的经验呢?除了用IO,还能用什么。

使用特权

评论回复
7
yiy| | 2017-6-29 22:18 | 只看该作者
根据你要求的频率,不高。用IO和定时器,完全可以做到。

使用特权

评论回复
8
Metalor|  楼主 | 2017-6-30 10:08 | 只看该作者
yiy 发表于 2017-6-29 22:18
根据你要求的频率,不高。用IO和定时器,完全可以做到。

已经做到,只是精度达不到要求。
已有解决方案,换新唐M451带12路PWM。

使用特权

评论回复
9
huangcunxiake| | 2017-6-30 16:02 | 只看该作者
Metalor 发表于 2017-6-30 10:08
已经做到,只是精度达不到要求。
已有解决方案,换新唐M451带12路PWM。

PMW做还是可以的,如果用IO,方法要设计正确,直接操作肯定是不够精度。

使用特权

评论回复
10
huangcunxiake| | 2017-6-30 16:03 | 只看该作者
精度控制,就是选择的周期刚好存在一个可以操作的最小公约数。

使用特权

评论回复
11
Metalor|  楼主 | 2017-6-30 17:28 | 只看该作者
huangcunxiake 发表于 2017-6-30 16:03
精度控制,就是选择的周期刚好存在一个可以操作的最小公约数。

并没有最小公约数……而且数据(周期)还是不断变化的。
或者你可以说的更详细一些,洗耳恭听

使用特权

评论回复
12
yiy| | 2017-6-30 19:49 | 只看该作者
他的意思估计是,你找到一个最小的时间中断,这个中断里能够处理好所有通道的设置。进入中断后清理标志就开始计数。。
那些IO输出方波半周期都是这个最小中断时间的整数倍,这样就可以妥善处理那个周期修改了。
不过你能用PWM就用PWM,PWM配置好就 自动执行了。

使用特权

评论回复
13
Metalor|  楼主 | 2017-7-3 15:59 | 只看该作者
yiy 发表于 2017-6-30 19:49
他的意思估计是,你找到一个最小的时间中断,这个中断里能够处理好所有通道的设置。进入中断后清理标志就开 ...

问个最简单的问题:当两个IO口需要同时翻转(肯定在某些瞬间存在这样的情况),而CPU又不可能同时操作两个IO口。这时,后翻转的IO是否慢了?
这是无法避免的一种情况,目前只想到PWM可以解决这个问题。

使用特权

评论回复
14
huangcunxiake| | 2017-7-4 23:46 | 只看该作者
多个IO翻转,可以通过逻辑运算后同时翻转。你直接P1=xxx,不是可以翻转8个端口或者16个。。

使用特权

评论回复
15
Metalor|  楼主 | 2017-7-5 08:42 | 只看该作者
如果一个是P1一个是P2呢?如果两个端口之间只差一个机器周期呢?

使用特权

评论回复
16
yiy| | 2017-7-6 21:50 | 只看该作者
Metalor 发表于 2017-7-5 08:42
如果一个是P1一个是P2呢?如果两个端口之间只差一个机器周期呢?

32位机,最高一次操作16BIT,p1和p2在一起一般的宏名是PA

使用特权

评论回复
17
yiy| | 2017-7-6 21:50 | 只看该作者
不过理论上32BIT的CPU最高一次是可以操作32BIT的。要看手册和头文件怎么定义的。

使用特权

评论回复
18
yiy| | 2017-7-6 21:51 | 只看该作者
如果支持32BIT,头文件只提供最高的16BIT,那么可以自己添加宏名,映射到端口地址就可以了。

使用特权

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

本版积分规则

2

主题

224

帖子

1

粉丝