dsPIC33F之Center_Aligned_PWM

本文介绍了如何使用dsPIC33FJ46GS610微控制器设置中心对齐PWM模块。通过配置PWM1和PWM2输出,实现了不同占空比的400kHz PWM信号生成。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/**************************************************************************************
*  ?2008 Microchip Technology Inc.                                         
*                                                                           
*  FileName:              Center_Aligned_PWM.c                                    
*  Dependencies:          Header (.h) files if applicable, see below        
*  Processor:             dsPIC33FJ46GS610                                  
*  Compiler:              MPLAB?C30 v3.02 or higher                        
*  IDE:                   MPLAB?IDE v8.36.02 or later                         
*  Hardware Dependencies: explorer 16 board		             
*                                                                           
*  SOFTWARE LICENSE AGREEMENT:                                              
* Microchip Technology Incorporated ("Microchip") retains all ownership and 
* intellectual property rights in the code accompanying this message and in all 
* derivatives hereto.  You may use this code, and any derivatives created by 
* any person or entity by or on your behalf, exclusively with Microchip's
* proprietary products.  Your acceptance and/or use of this code constitutes 
* agreement to the terms and conditions of this notice.
*
* CODE ACCOMPANYING THIS MESSAGE IS SUPPLIED BY MICROCHIP "AS IS".  NO 
* WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT NOT LIMITED 
* TO, IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A 
* PARTICULAR PURPOSE APPLY TO THIS CODE, ITS INTERACTION WITH MICROCHIP'S 
* PRODUCTS, COMBINATION WITH ANY OTHER PRODUCTS, OR USE IN ANY APPLICATION. 
*
* YOU ACKNOWLEDGE AND AGREE THAT, IN NO EVENT, SHALL MICROCHIP BE LIABLE, WHETHER 
* IN CONTRACT, WARRANTY, TORT (INCLUDING NEGLIGENCE OR BREACH OF STATUTORY DUTY), 
* STRICT LIABILITY, INDEMNITY, CONTRIBUTION, OR OTHERWISE, FOR ANY INDIRECT, SPECIAL, 
* PUNITIVE, EXEMPLARY, INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, FOR COST OR EXPENSE OF 
* ANY KIND WHATSOEVER RELATED TO THE CODE, HOWSOEVER CAUSED, EVEN IF MICROCHIP HAS BEEN 
* ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE.  TO THE FULLEST EXTENT 
* ALLOWABLE BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY RELATED TO 
* THIS CODE, SHALL NOT EXCEED THE PRICE YOU PAID DIRECTLY TO MICROCHIP SPECIFICALLY TO 
* HAVE THIS CODE DEVELOPED.
*
* You agree that you are solely responsible for testing the code and 
* determining its suitability.  Microchip has no obligation to modify, test, 
* certify, or support the code.
*
* Description:                                                              
* This program sets up the PWM module for center aligned mode operation. The 
* PWM1 outputs are configured to produce a 400kHz PWM signal with independent 
* duty cycle. PWM1H produces 50% duty cycle and PWM1L produces 25% duty cycle.
* PWM2 outputs are configured to produce 400kHz PWM in complementary mode. The 
* duty cycle of PWM2 is 50%. 
*                                                                           
*                                                                           
*****************************************************************************/

#include "p33FJ64GS610.h"

/* Configuration Bit Settings */
_FOSCSEL(FNOSC_FRC)
_FOSC(FCKSM_CSECMD & OSCIOFNC_ON)
_FWDT(FWDTEN_OFF)
_FPOR(FPWRT_PWR128 )
_FICD(ICS_PGD1 & JTAGEN_OFF)

void init_PWM(void);

int main()
{
    /* Configure Oscillator to operate the device at 40Mhz
	   Fosc= Fin*M/(N1*N2), Fcy=Fosc/2
 	   Fosc= 7.37*(43)/(2*2)=80Mhz for Fosc, Fcy = 40Mhz */

	/* Configure PLL prescaler, PLL postscaler, PLL divisor */
	PLLFBD=41; 	/* M = PLLFBD + 2 */
	CLKDIVbits.PLLPOST=0;   /* N1 = 2 */
	CLKDIVbits.PLLPRE=0;    /* N2 = 2 */

    __builtin_write_OSCCONH(0x01);		/* New Oscillator FRC w/ PLL */
    __builtin_write_OSCCONL(0x01);  		/* Enable Switch */
      
	while(OSCCONbits.COSC != 0b001);	/* Wait for new Oscillator to become FRC w/ PLL */  
    while(OSCCONbits.LOCK != 1);		/* Wait for Pll to Lock */
	/* Now setup the ADC and PWM clock for 120MHz
	   ((FRC * 16) / APSTSCLR ) = (7.37 * 16) / 1 = ~ 120MHz*/

	ACLKCONbits.FRCSEL = 1;		/* FRC provides input for Auxiliary PLL (x16) */
	ACLKCONbits.SELACLK = 1;		/* Auxiliary Oscillator provides clock source for PWM & ADC */
	ACLKCONbits.APSTSCLR = 7;		/* Divide Auxiliary clock by 1 */
	ACLKCONbits.ENAPLL = 1;		/* Enable Auxiliary PLL */
	
	while(ACLKCONbits.APLLCK != 1);	/* Wait for Auxiliary PLL to Lock */
    
	init_PWM();
    
    while(1);                   		/* Infinite Loop */
}

void init_PWM()
{
    
    /* ~~~~~~~~~~~~~~~~~~~~~~ PWM1 Configuration ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */    
    IOCON1bits.PENH = 1;   			/* PWM1H is controlled by PWM module */
    IOCON1bits.PENL = 1;   			/* PWM1L is controlled by PWM module */
    IOCON1bits.PMOD = 3;   			/* Select Independent Output PWM mode */

    PWMCON1bits.CAM = 1;                    /* Select Center-aligned mode */
    PWMCON1bits.ITB = 1;                    /* Select Independent timebase mode (required for
                                               center-aligned mode) */
	
    PHASE1 = 1202;             		/* In Center-aligned mode the effective period of 
                                               the PWM signal is twice of the value in the 
                                               PHASEx register. So to obtain signal of 400kHz
                                               (or 2.5us period), the PHASE1 register should be
                                               configured for a period of 1.25us.
                                               PHASE1 = ((1.25us) / 1.04ns) = 1202. So effective
                                               period is 2.5us. */

    SPHASE1 = 1202;             		/* In Center-aligned mode the effective period of 
                                               the PWM signal is twice of the value in the 
                                               SPHASEx register. So to obtain signal of 400kHz
                                               (or 2.5us period), the SPHASE1 register should be
                                               configured for a period of 1.25us.
                                               SPHASE1 = ((1.25us) / 1.04ns) = 1202. So effective
                                               period is 2.5us. */
                                               
    PDC1 = 601;                 	/* In Center-aligned mode the effective duty cycle of 
                                               the PWM signal is twice of the value in the 
                                               PDCx register. To achieve 50% duty cycle configure
                                               PDCx register to 0.625us.
                                               PDC1 = ((0.625us) / 1.04ns) = 601. */
    
    SDC1 = 301;                 	/* In Center-aligned mode the effective duty cycle of 
                                               the PWM signal is twice of the value in the 
                                               SDCx register. To achieve 25% duty cycle configure
                                               PDCx register to 0.312us.
                                               PDC2 = ((0.312us) / 1.04ns) = 301. */
    

    /* ~~~~~~~~~~~~~~~~~~~~~~ PWM2 Configuration ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */    
    IOCON2bits.PENH = 1;   			/* PWM1H is controlled by PWM module */
    IOCON2bits.PENL = 1;   			/* PWM1L is controlled by PWM module */
    IOCON2bits.PMOD = 0;   			/* Select Complementary Output PWM mode */

    PWMCON2bits.CAM = 1;                    /* Select Center-aligned mode */
    PWMCON2bits.ITB = 1;                    /* Select Independent timebase mode (required for
                                               center-aligned mode) */
	
    ALTDTR2 = 63;    			/* ALTDeadtime = (65ns / 1.04ns) where 65ns is desired deadtime
                                               When in center-aligned mode only use ALTDTRx */           
                         
    PHASE2 = 1202;             		/* In Center-aligned mode the effective period of 
                                               the PWM signal is twice of the value in the 
                                               PHASEx register. So to obtain signal of 400kHz
                                               (or 2.5us period), the PHASE1 register should be
                                               configured for a period of 1.25us.
                                               PHASE1 = ((1.25us) / 1.04ns) = 1202. So effective
                                               period is 2.5us. */

                                             
    PDC2 = 601;                 		/* In Center-aligned mode the effective duty cycle of 
                                               the PWM signal is twice of the value in the 
                                               PDCx register. To achieve 50% duty cycle configure
                                               PDCx register to 0.625us.
                                               PDC1 = ((0.625us) / 1.04ns) = 601. */
    

    PTCONbits.PTEN = 1;			  /* Enable the PWM Module */
}

<think>我们正在讨论STM32定时器的中心对齐模式(Center Aligned Mode),特别是模式1。在STM32的定时器中,计数器有三种计数模式:向上计数、向下计数和中心对齐模式。中心对齐模式又分为三种:模式1、模式2和模式3。 中心对齐模式(Center Aligned Modes)的主要特点是计数器先向上计数到自动重载值(Auto-Reload Register, ARR),然后向下计数到0(或反之),这样计数器的变化是对称的,因此称为中心对齐。这种模式常用于产生对称的PWM波形,例如在电机控制中,可以产生中心对称的PWM信号,从而减少电磁噪声。 具体到Center Aligned Mode 1: - 在模式1下,计数器先向上计数到ARR,然后向下计数到0,再重新向上计数。这样,一个完整的周期包括向上计数和向下计数两个阶段。 - 计数器的计数值变化范围是0到ARR(向上计数)再到0(向下计数),因此一个完整周期的计数值变化量为2*ARR(从0到ARR再到0)。 该模式下的时序特点: - 更新事件(Update Event, UE)发生在计数器从ARR向下计数的时刻(即达到ARR时)和计数器从0开始向上计数的时刻(即达到0时)?实际上,在中心对齐模式下,更新事件发生在计数器达到0和ARR的时候。但是具体到模式1,根据参考手册,更新事件(UEV)在计数器向下计数到0时产生(即下溢事件)和向上计数到ARR时产生(即上溢事件)?实际上,在中心对齐模式下,更新事件只发生在计数器达到0或ARR的时候,但具体取决于模式。 根据STM32参考手册(RM0008)的定时器章节: - 在中心对齐模式1(TIMx_CR1寄存器的CMS位设置为“01”): 计数器交替向上和向下计数。更新事件在计数器达到ARR值(上溢)和0值(下溢)时都产生。但是,输出比较通道的极性(在向上计数和向下计数时)可以分别设置,从而产生中心对称的PWM波形。 中心对齐模式1的时序图(以ARR=3为例): ``` 计数序列:0 -> 1 -> 2 -> 3 -> 2 -> 1 -> 0 -> 1 -> 2 -> 3 ... 更新事件:在计数到3(上溢)和0(下溢)时产生更新事件。 ``` 在PWM输出模式中,中心对齐模式可以产生对称的PWM波形。例如,当设置比较寄存器(CCR)为某个值时,在向上计数期间,当计数器小于CCR时,输出为有效电平;在向下计数期间,当计数器小于CCR时,输出也为有效电平。这样,PWM脉冲以周期中心为对称轴。 中心对齐模式1(模式1)与模式2和模式3的区别: - 模式1:更新事件在上溢(计数器达到ARR)和下溢(计数器达到0)时都发生。 - 模式2:更新事件只在上溢时发生(计数器达到ARR)。 - 模式3:更新事件只在下溢时发生(计数器达到0)。 在配置定时器时,通过TIMx_CR1寄存器的CMS[1:0]位来设置中心对齐模式: - 00:边沿对齐模式(向上或向下计数) - 01:中心对齐模式1(更新事件在上溢和下溢时都发生) - 10:中心对齐模式2(更新事件只在上溢时发生) - 11:中心对齐模式3(更新事件只在下溢时发生) 应用场景: 中心对齐模式特别适合用于电机控制(如三相无刷电机)和开关电源等需要对称PWM波形的场合,因为对称的PWM可以减小谐波分量,从而降低电磁干扰(EMI)。 在CubeMX中配置中心对齐模式1: 1. 在定时器配置界面,选择“Clock Source”为“Internal Clock”。 2. 在“Counter Settings”中: - Counter Mode: 选择“Center Aligned Mode 1” - Prescaler: 设置预分频值(根据输入时钟频率和所需定时器频率计算) - Counter Period: 设置ARR的值(即自动重载值) - Auto-reload preload: 建议使能(Enable),这样可以在更新事件发生时才更新ARR的值,避免在计数过程中改变ARR造成的不一致。 3. 配置PWM输出通道(如果需要): - PWM模式:选择PWM模式1或2 - 设置Pulse(即CCR的值)以控制占空比 注意:在中心对齐模式下,计数器的频率是边沿对齐模式的一半(因为一个周期内计数了两次:向上和向下)。因此,PWM频率的计算公式为: $$f_{\text{PWM}} = \frac{f_{\text{TIM}}}{2 \times \text{ARR}}$$ 其中,$f_{\text{TIM}}$是定时器的输入时钟频率(即经过预分频器之前的频率除以预分频系数+1)。 总结:中心对齐模式1是中心对齐模式的一种,它在计数器达到ARR(上溢)和0(下溢)时都产生更新事件,适用于需要对称PWM波形的应用。 §§相关问题§§ 1. 中心对齐模式2和模式3有什么不同? 2. 如何计算中心对齐模式下的PWM频率? 3. 在电机控制中,中心对齐模式有什么优势?</think>### STM32定时器中心对齐模式1(Center Aligned Mode 1)详解 中心对齐模式是STM32高级定时器(如TIM1/TIM8)的核心功能之一,主要用于生成对称的PWM波形。模式1是三种中心对齐模式中的一种,其工作原理和配置要点如下: #### 1. **基本工作原理** 在中心对齐模式1下,计数器执行**先向上后向下**的对称计数过程: 1. 从0开始**向上计数**到自动重载值(ARR) 2. 到达ARR后**向下计数**回0 3. 重复上述过程 计数过程可表示为: $$0 \rightarrow \text{ARR} \rightarrow 0 \rightarrow \cdots$$ 此时PWM波形以周期中点为中心对称分布,如下图所示: ``` ▲ | ********* ********* PWM | * * * * 输出 | * * * * |__*_____________*_____________*___▶ 0 ARR/2 ARR 时间轴 ``` #### 2. **关键特性** - **对称波形生成**:PWM脉冲在周期中心位置对称分布 - **双更新事件**:每个PWM周期产生两次更新事件(UEV): - 向上计数到ARR时(上溢) - 向下计数到0时(下溢) - **中断触发**:可配置在上下溢时触发中断 - **输出比较**:比较事件在向上/向下计数时分别触发 #### 3. **CubeMX配置步骤** 1. **定时器基础设置**: - 模式:选择"PWM Generation CHx" - 时钟源:Internal Clock - 计数模式:Center Aligned Mode 1 2. **Counter Settings参数**: ```c Prescaler = 71 // 预分频值(72MHz/(71+1)=1MHz) Counter Period = 999 // ARR值(决定PWM周期) Auto-Reload Preload = Enable // 缓冲ARR更新 Counter Mode = Center Aligned Mode 1 ``` 3. **PWM参数计算**: - PWM频率计算公式: $$f_{\text{PWM}} = \frac{f_{\text{TIM}}}{( \text{ARR} + 1 ) \times 2}$$ 例如:$f_{\text{TIM}}=1\text{MHz}, \text{ARR}=999$ → $f_{\text{PWM}}=500\text{Hz}$ - 占空比计算: $$\text{Duty} = \frac{\text{CCR}}{\text{ARR}} \times 100\%$$ #### 4. **模式1 vs 其他模式** | 特性 | 模式1 | 模式2 | 模式3 | |--------------|-------------------|-------------------|-------------------| | **计数方向** | 上→下 | 下→上 | 上→下 | | **更新事件** | 上溢+下溢 | 仅下溢 | 仅上溢 | | **中断触发** | 两次/周期 | 一次/周期 | 一次/周期 | | **适用场景** | 精确对称控制 | 单事件触发 | 单事件触发 | #### 5. **典型应用场景** 1. **电机控制**: - 生成对称的3相PWM驱动无刷电机 - 减少电磁干扰(EMI)和电流谐波[^1] 2. **电源转换**: - 用于LLC谐振转换器 - 实现零电压开关(ZVS) 3. **音频应用**: - D类放大器输出级驱动 - 降低总谐波失真(THD) #### 6. **代码实现要点** ```c // CubeMX生成的初始化代码 TIM_HandleTypeDef htim1; void MX_TIM1_Init(void) { TIM_ClockConfigTypeDef sClockSourceConfig = {0}; TIM_MasterConfigTypeDef sMasterConfig = {0}; TIM_OC_InitTypeDef sConfigOC = {0}; htim1.Instance = TIM1; htim1.Init.Prescaler = 71; htim1.Init.CounterMode = TIM_COUNTERMODE_CENTERALIGNED1; // 模式1 htim1.Init.Period = 999; htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim1.Init.RepetitionCounter = 0; htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE; HAL_TIM_PWM_Init(&htim1); // 启动PWM通道 HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1); } // 动态调整占空比 void Set_PWM_Duty(uint16_t duty) { __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, duty); } ``` #### 7. **设计注意事项** 1. **死区时间**:电机控制中必须配置死区时间(Dead Time) ```c TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig = {0}; sBreakDeadTimeConfig.DeadTime = 0x8F; // 约5μs@72MHz HAL_TIMEx_ConfigBreakDeadTime(&htim1, &sBreakDeadTimeConfig); ``` 2. **中断处理**:利用更新事件实现精确时序控制 ```c void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { if(htim->Instance == TIM1) { // 上下溢事件处理 } } ``` 3. **性能优化**:ARR值建议设置为$2^n-1$(如1023)以提高计算效率[^2] > **关键优势**:相比边沿对齐模式,中心对齐模式1可降低50%的电流纹波,显著提高系统效率[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值