在mm32f3270上为micropython创建PWM模块(2)
文章目录
Architect
上文提到, 参考esp系的实现模型. 但具体几个问题还要想明白才能动手.
共用时基的问题
原本想着时基初始化之后, 后面新创建别的通道就不能再动基础频率的. 但再想这样也不合理, 如果不让后面的通道动基础频率, 本身这个通道也改不了基础频率, 因为它们使用同样的函数接口.
索性很粗暴的做法, 每次实例化代码都重新配置一遍时基, 这样最终生效的是最后一次配置时基. 承认共用同一个时基的通道存在耦合.
在micropython中,公用同一个时基的多个通道, 公用同一个时基配置, counter_conf, 然后各自通道有自己的channel_conf
实例化传参
同上文描述, 允许三种类型的实例化绑定硬件通道:
- 同类对象
- 通道编号
- 引脚名称
freq和duty
-
freq
- 就按"共用实际的问题"中的描述, 以最后一次配置为准.
- 一个新思路, freq以第一次配置为准, 后续配置频率的操作无效, 除非调用了deinit. 这样代码更安全一点, 也兼顾了灵活性.
- 为输出pwm信号的频率, 而不是pwm的分辨率.
-
duty
- duty的周期固定为1000, 可调范围为0-1000
-
在内部用掩码标记PWM通道的激活情况. 掩码的内存放在counter_conf中.
应用场景
竟然没有定时器的start和stop接口, 这就不能期望多通道同步输出了. 设定实例化PWM对象之后就立刻输出.
deinit在实际不会关掉引脚输出, 而是将duty调为0.
deinit函数中会看, 如果所有的pwm通道都处于非激活状态, 就可以直接stop定时器.
使用两个TIM组合
这样的软件架构更完整一点, 可以适配多TIM的情况. 代码虽然稍复杂一点, 但值得尝试.
MM32的TIM, 在大多情况下, 一个定时器对4个输出通道(互补通道不能独立编程, 不算), 如果要支持机器手/机器猫之类的应用, 至少需要8个输出通道.
思路清晰了, 准备动手写代码…