打印
[学习笔记]

【AutoChips 7801x MCU评测报告】三、PWM

[复制链接]
848|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
      本次实验利用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)

使用特权

评论回复

相关帖子

沙发
caizhiwei| | 2020-6-20 09:19 | 只看该作者
学习了,很不错!

使用特权

评论回复
板凳
lisingch|  楼主 | 2020-6-20 11:58 | 只看该作者
caizhiwei 发表于 2020-6-20 09:19
学习了,很不错!

谢谢捧场!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

99

主题

14990

帖子

17

粉丝