本次实验利用PWM1_CH6的输出,控制在其输出引脚上连接的LED2,使LED2在不同占空比的PWM波驱动下呈现不同的亮度等级。
一、实验资源
1、AC7801x开发板;
2、AutoGen Studio 1.2.0;
3、KEIL 5.28.0.0;
4、ST-LINK2;
5、逻辑分析仪
二、资源简介
AC7801x具有两个脉宽调制(PWM)模块,每个模块支持8个通道。具有互补输出功能,死区插入非常适宜电机控制。下面是手册中对此模块的相关描述:
PWM模块具有多种工作模式,可配置为输入捕获、输出比较或边沿对齐PWM模式、中心对齐PWM模式、组合模式、正交解码模式等。本次实验是如上工作模式中比较简单的一种-边沿对齐PWM模式(EPWM)。
在边沿对齐PWM模式(EPWM)这一工作模式中,作为应用主要关心的是PWM波周期(频率)、占空比、输出极性。本次实验使用了PWM1模块的通道6,因其输出正好可以控制连接在此引脚上的LED2。另外实验中还同时配置了PWM1_CH7,用于同PWM1_CH6输出极性做对比,这两个通道其它参数配置相同。
首先确定PWM输出的周期(频率),PWM计数器的时钟源可以选用HSI或APB,实验时选择了APB时钟,外部晶振经PLL、分频等一系列折腾后APB时钟为24MHz。与PWM输出周期有关的参数还有CNTIN和MCVR,如:
下面根据公式进行PWM周期计算,以APB_CLK=24MH时PWM输出10KHz为例。为方便计算取CNTIN=0;MCVR=2399
根据公式:PWM周期 = (MCVR-CNTIN + 0x0001)×PWM计数器时钟周期
= (2399-0+1) *1/24000000
=0.0001s
=10KHz
对于PWM输出的极性可根据具体的应用进行选择。脉冲宽度 (占空比)可以根据如下公式进行计算:
脉冲宽度 (占空比)=(CHnV + 0x0001 – CNTIN) ×PWM计数器时钟周期
为便于观察占空比,本次实验中将PWM1_CH6及PWM1_CH7的CHnV值均设置为599,根据上式可计算出占空比为25%。
三、代码实现
先看看“AutoGen Studio”配置:
下面是配置代码:
void ATC_PWM1_Init(void)
{
PWM_ConfigType pwmConfig;
PWM_ModulationConfigType initModeStruct;
MSP_PWM_Init(PWM1);
pwmConfig.mode = PWM_MODE_MODULATION;
pwmConfig.clkSource = PWM_CLK_SOURCE_APB;
pwmConfig.clkPsc = 0;
pwmConfig.initValue = 0;
pwmConfig.maxValue = 2399;
pwmConfig.overflowInterrupEn = DISABLE;
pwmConfig.cntOverflowFreq = 0;
pwmConfig.interruptEn = DISABLE;
initModeStruct.countMode = PWM_UP_COUNT;
initModeStruct.deadtime = 0;
initModeStruct.deadtimePsc = PWM_DEADTIME_DIVID_1;
initModeStruct.initChOutputEn = DISABLE;
initModeStruct.initTriggerEn = DISABLE;
PWM_IndependentChConfig independentChConfig[2];
/* independent channel 6 configuration */
independentChConfig[0].channel = PWM_CH_6;
independentChConfig[0].chValue = 599;
independentChConfig[0].levelMode = PWM_LOW_TRUE;
independentChConfig[0].polarity = PWM_OUTPUT_POLARITY_ACTIVE_LOW;
independentChConfig[0].interruptEn = DISABLE;
independentChConfig[0].initLevel = PWM_LOW_LEVEL;
independentChConfig[0].triggerEn = DISABLE;
/* independent channel 7 configuration */
independentChConfig[1].channel = PWM_CH_7;
independentChConfig[1].chValue = 599;
independentChConfig[1].levelMode = PWM_HIGH_TRUE;
independentChConfig[1].polarity = PWM_OUTPUT_POLARITY_ACTIVE_HIGH;
independentChConfig[1].interruptEn = DISABLE;
independentChConfig[1].initLevel = PWM_HIGH_LEVEL;
independentChConfig[1].triggerEn = DISABLE;
initModeStruct.independentChannelNum = 2;
initModeStruct.independentChConfig = independentChConfig;
pwmConfig.initModeStruct = &initModeStruct;
PWM_Init(PWM1, &pwmConfig);
}
本来考虑利用一只按键来控制不同的占空比PWM输出,由于基本的实验目的达到了就没有写这部分代码,待后期实验时再完善。
四、实验结果
五、实验总结
通过本实验对PWM模块有了基本认识,对于其它的工作模式还有待于进一步实验。
六、附件
PWM1_CH6.rar
(1.04 MB)
|