输出互为180度的PWM

输出互为180度的PWM? 如下图:

pwm180.JPG

考虑了一下,使用STM32 的任意一个定时器都可以实现楼主的要求。

基本设置如下:
1)配置定时器的计数器为中间对齐计数,即先向上计数再向下计数。
2)在该定时器上选择2个通道,并分别配置为输出比较模式,并配置在比较成功时翻转对应的引脚输出。
3)配置自动重装载寄存器TIMx_ARR为要求输出频率的一半。
4)假定CC1为第一个输出信号的通道,再假定第一个信号的正脉冲宽度对应为W1,则配置TIMx_CCR1为TIMx_ARR-W1/2。
5) 同4),假定CC2为第二个输出信号的通道,正脉冲宽度对应为W2,配置TIMx_CCR2为W2/2。

----------------------------------------------
下面以一个例子说明:

假设要求输出的信号频率为10kHz,占空比为1:3。
再假设定时器的输入时钟为72MHz。

输出信号的频率10kHz,换算为计数器的数值为7200。
按照上述3),设置TIMx_ARR=3600

输出信号1的高电平时间W1,换算为计数器的数值为W1=7200/4=1800
按照上述4),设置TIMx_CC1=3600 - W1/2=2700

输出信号2的高电平时间W2,换算为计数器的数值为W2=7200/4=1800
按照上述5),设置TIMx_CC2=2/2=450

参照下图,图中红线表示计数器的数值变化:
①当计数器的数值从0向上计数,达到TIMx_CC1时,CC1匹配成功,CC1的输出电平翻转;
②计数器继续向上计数,达到TIMx_ARR时开始调头向下计数;当计数器的数值下降到TIMx_CC1时,CC1再次匹配成功,CC1的输出电平再次翻转;
③计数器继续向下计数,达到到TIMx_CC2时,CC2匹配成功,CC2的输出电平翻转;
④计数器继续向下计数,减到0时开始调头向上计数;当计数器的数值上升到TIMx_CC2时,CC2再次匹配成功,CC2的输出电平再次翻转;

如此循环,得到连续的相位互为180度的两路输出波形。

注意:上述描述是一个原理性的说明,但能够输出要求的波形并且占空比可调,实际编程计算中需要可能需要对某些数值加1或者减1,以达到准确地输出。

STM32_Outout_180degree.gif


再来一个占空比大于50%的示意图:

STM32_Outout_180degree1.gif


参考网址:http://bbs.21ic.com/icview-150646-1-1.html


### 如何生成互补PWM波 为了生成互补PWM波,通常需要配置两个PWM通道来输出具有反极性的信号。这可以通过调整定时器的参数以及设置合适的寄存器来完成。 #### 配置定时器和PWM模块 在DSP28335上生成互补PWM波时,除了基本的PWM初始化外,还需特别注意定时器自动重装载值(ARR)和预分频系数(PSC)的设定[^1]。这两个参数决定了PWM周期长。对于STM32系列MCU来说,其操作方式与普通定时器似,在此过程中同样涉及到ARR和PSC的合理配置[^2]。 #### 同步机制的重要性 当涉及多个PWM输出时,保持它们之间的同步至关重要。如果不加以管理,则可能会引入不必要的位差,进而影响到最终的应用效果,比如驱动电机或其他负载时可能出现效率下降的情况[^3]。因此,在编写代码之前应该先考虑好如何解决这个问题。 #### 实现互补PWM的具体做法 一种常见的方式是在同一个定时器下开启两个独立但互关联的比较单元,分别用于上升沿触发的第一个PWM脉冲宽调制器(CMPA),以及下降沿触发第二个(PWM_B)。通过这种方式能够确保两者始终保持90或者180的关系,即形成所谓的“互补”。 以下是基于C语言的一个简单例子: ```c // 假设已经完成了必要的硬件初始化工作 void setup_complementary_pwm(void){ // 设置定时器频率, 这里假设使用的是系统默认时钟源 TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; // 定义计数值上限(ARR), 此处仅为示意,请根据实际需求调整 uint16_t period_value = 1000; // 初始化TIMx时间基结构体成员变量 TIM_TimeBaseStructInit(&TIM_TimeBaseStructure); // 对应于特定型号单片机上的某一个通用定时器实例化对象 TIM_TimeBaseStructure.TIM_Period = period_value - 1 ; TIM_TimeBaseStructure.TIM_Prescaler = 72 - 1 ; TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; // 应用上述配置至目标定时器 TIM_TimeBaseInit(TIMx, &TIM_TimeBaseStructure); // 接下来定义CMPA 和 CMPB 的初始占空比比例... } // 更新PWM占空比函数 void update_duty_cycle(float duty_ratio){ int compare_val_a = (int)(duty_ratio * PERIOD_VALUE); int compare_val_b = PERIOD_VALUE - compare_val_a ; // 将计算得到的结果写入应的捕获/比较寄存器中 TIM_SetCompare1(TIMx,compare_val_a ); TIM_SetCompare2(TIMx,compare_val_b ); } ``` 这段伪码展示了怎样利用一对匹配的比较事件来创建一组互为反向关系的PWM波形。需要注意的是,具体的API名称取决于所使用的开发环境及芯片厂商提供的库文件版本号;此外,还应当考虑到不同平台间存在的细微差异。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值