求问如何能做出这样的PWM波形,试了好多方法。

2019-10-14 21:58发布

用PWM比较输出模式的话,虽然可以调相位差,但是,占空比却不能调。
如果用PWM输出模式的话,可以调占空比,但是相位差却不能调。
请问各位大神,这四路波形要怎么调出来啊。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
26条回答
K.O.Carnivist
1楼-- · 2019-10-16 23:50
vention 发表于 2016-10-8 09:45
我把你的程序复制烧录在F103的开发板上,试过了,可行,可是有很多地方看不懂。比如,定时器2 TIM2是用来 ...

TIM1的作用是:启动之后会计数更新6个周期,然后自己停止计数。这6个周期期间会按顺序输出4个脉冲,但输出完后就停止了不会输出下一组。
TIM2的作用是定期启动TIM1。调整总周期就是调整TIM2的周期。

TIM1输出4个脉冲的过程由TIM1的6个周期完成,6个周期的状态分别是:
周期0:CH1输出使能,其他通道输出禁止。
周期1:CH1、CH2输出使能,其他通道输出禁止。
周期2:CH2、CH3输出使能,其他通道输出禁止。
周期3:CH3、CH4输出使能,其他通道输出禁止。
周期4:CH4输出使能,其他通道输出禁止。
周期5:所有通道输出禁止。
这6个状态就是由CCER中的CCxE来控制的,对应的就是CCER_Buffer。

可以看到对每个通道来说,有2个周期是输出使能的,在这2个周期中这个通道的行为是:
1. 第一周期的CNT=1时刻触发通道的比较事件,通道输出Toggle变为低电平。
2. 同时触发DMA改写CCER,这个通道输出使能。
3. 第二周期的CNT=1时刻触发比较事件,通道输出Toggle变为高电平。
4. 第三周期的CNT=1时刻触发比较事件,通道输出Toggle变为低电平。
5. 同时触发DMA改写CCER,这个通道输出禁止,即此后保持低电平。
其中第3~4步之间的时间就是输出的脉冲。

漏掉的一点是如何让第1步Toggle之后这个通道输出的是低电平,这个是由CCER中的CCxP来控制的。

vention
2楼-- · 2019-10-17 01:56
K.O.Carnivist 发表于 2016-10-8 12:38
TIM1的作用是:启动之后会计数更新6个周期,然后自己停止计数。这6个周期期间会按顺序输出4个脉冲,但输 ...

研究了你的话好久,但还是不懂  CCER_Buffer 数组中的值的计算。
uint16_t CCER_Buffer[6] = {
                            0x0203,
                            0x0213,
                            0x0312,
                            0x1302,
                            0x1202,
                            0x0202}
K.O.Carnivist
3楼-- · 2019-10-17 02:52
vention 发表于 2016-10-9 09:25
研究了你的话好久,但还是不懂  CCER_Buffer 数组中的值的计算。
uint16_t CCER_Buffer[6] = {
        ...

啊?
CCER = 0x0203 就是CH4高电平有效、输出禁止,CH3低电平有效、输出禁止,CH2高电平有效、输出禁止,CH1低电平有效、输出使能……
CCER = 0x0213 就是CH4高电平有效、输出禁止,CH3低电平有效、输出禁止,CH2高电平有效、输出使能,CH1低电平有效、输出使能……
按CCER每一位的定义计算……
vention
4楼-- · 2019-10-17 06:44
K.O.Carnivist 发表于 2016-10-9 09:49
啊?
CCER = 0x0203 就是CH4高电平有效、输出禁止,CH3低电平有效、输出禁止,CH2高电平有效、输出禁止 ...

soga  秒懂
vention
5楼-- · 2019-10-17 09:53
 精彩回答 2  元偷偷看……
K.O.Carnivist
6楼-- · 2019-10-17 13:27
vention 发表于 2016-10-10 15:13
还有两小点不清楚的,望前辈提供资料查询。
①: (uint32_t)0x40012C20;   /* TIM1_CCER */     地址是 ...


以 F103 为例,先在参考手册里面找 Memory and bus architecture 这一章的 Memory map,找到 TIM1 的基地址是 0x4001 2C00;然后在 Advanced-control timers 一章的 TIM1&TIM8 register map 里找到 TIMx_CCER 的偏移是 0x20。
或者写成 DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&(TIM1->CCER) 这样也行,不用查地址了。


参考手册里面 Timers 章节的寄存器描述,TIMx_SMCR 的描述下面有表格,写了每个定时器做从机的4个内部触发源分别来自哪个定时器。

一周热门 更多>