[学习笔记] 【AutoChips 7801x MCU评测报告】三、PWM

[复制链接]
1469|2
 楼主| lisingch 发表于 2020-6-18 21:05 | 显示全部楼层 |阅读模式
      本次实验利用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个通道。具有互补输出功能,死区插入非常适宜电机控制。下面是手册中对此模块的相关描述:
2020-06-18_195552.png
2020-06-18_195619.png
2020-06-18_195633.png
2020-06-18_195808.png
2020-06-18_195956.png
2020-06-18_200117.png
2020-06-18_200143.png
2020-06-18_200203.png
      PWM模块具有多种工作模式,可配置为输入捕获、输出比较或边沿对齐PWM模式、中心对齐PWM模式、组合模式、正交解码模式等。本次实验是如上工作模式中比较简单的一种-边沿对齐PWM模式(EPWM)。
2020-06-18_200514.png
2020-06-18_200716.png

      在边沿对齐PWM模式(EPWM)这一工作模式中,作为应用主要关心的是PWM波周期(频率)、占空比、输出极性。本次实验使用了PWM1模块的通道6,因其输出正好可以控制连接在此引脚上的LED2。另外实验中还同时配置了PWM1_CH7,用于同PWM1_CH6输出极性做对比,这两个通道其它参数配置相同。
      首先确定PWM输出的周期(频率),PWM计数器的时钟源可以选用HSI或APB,实验时选择了APB时钟,外部晶振经PLL、分频等一系列折腾后APB时钟为24MHz。与PWM输出周期有关的参数还有CNTIN和MCVR,如:
2020-06-18_202512.png
      下面根据公式进行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”配置:
2020-06-18_205501.png
2020-06-18_205517.png

下面是配置代码:
  1. void ATC_PWM1_Init(void)
  2. {
  3.     PWM_ConfigType pwmConfig;
  4.     PWM_ModulationConfigType initModeStruct;

  5.     MSP_PWM_Init(PWM1);

  6.     pwmConfig.mode = PWM_MODE_MODULATION;
  7.     pwmConfig.clkSource = PWM_CLK_SOURCE_APB;
  8.     pwmConfig.clkPsc = 0;
  9.     pwmConfig.initValue = 0;
  10.     pwmConfig.maxValue = 2399;
  11.     pwmConfig.overflowInterrupEn = DISABLE;
  12.     pwmConfig.cntOverflowFreq = 0;
  13.     pwmConfig.interruptEn = DISABLE;

  14.     initModeStruct.countMode = PWM_UP_COUNT;
  15.     initModeStruct.deadtime = 0;
  16.     initModeStruct.deadtimePsc = PWM_DEADTIME_DIVID_1;
  17.     initModeStruct.initChOutputEn = DISABLE;
  18.     initModeStruct.initTriggerEn = DISABLE;

  19.     PWM_IndependentChConfig independentChConfig[2];

  20.     /* independent channel 6 configuration */
  21.     independentChConfig[0].channel = PWM_CH_6;
  22.     independentChConfig[0].chValue = 599;
  23.     independentChConfig[0].levelMode = PWM_LOW_TRUE;
  24.     independentChConfig[0].polarity = PWM_OUTPUT_POLARITY_ACTIVE_LOW;
  25.     independentChConfig[0].interruptEn = DISABLE;
  26.     independentChConfig[0].initLevel = PWM_LOW_LEVEL;
  27.     independentChConfig[0].triggerEn = DISABLE;

  28.     /* independent channel 7 configuration */
  29.     independentChConfig[1].channel = PWM_CH_7;
  30.     independentChConfig[1].chValue = 599;
  31.     independentChConfig[1].levelMode = PWM_HIGH_TRUE;
  32.     independentChConfig[1].polarity = PWM_OUTPUT_POLARITY_ACTIVE_HIGH;
  33.     independentChConfig[1].interruptEn = DISABLE;
  34.     independentChConfig[1].initLevel = PWM_HIGH_LEVEL;
  35.     independentChConfig[1].triggerEn = DISABLE;

  36.     initModeStruct.independentChannelNum = 2;
  37.     initModeStruct.independentChConfig = independentChConfig;

  38.     pwmConfig.initModeStruct = &initModeStruct;

  39.     PWM_Init(PWM1, &pwmConfig);

  40. }


本来考虑利用一只按键来控制不同的占空比PWM输出,由于基本的实验目的达到了就没有写这部分代码,待后期实验时再完善。

四、实验结果
2020-06-17_225945.png
2020-06-17_225931.png

五、实验总结
      通过本实验对PWM模块有了基本认识,对于其它的工作模式还有待于进一步实验。

六、附件
PWM1_CH6.rar (1.04 MB, 下载次数: 14)

caizhiwei 发表于 2020-6-20 09:19 | 显示全部楼层
学习了,很不错!
 楼主| lisingch 发表于 2020-6-20 11:58 | 显示全部楼层
caizhiwei 发表于 2020-6-20 09:19
学习了,很不错!

谢谢捧场!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

99

主题

15005

帖子

19

粉丝
快速回复 在线客服 返回列表 返回顶部