[学习笔记] 【杰发科技AC7802x测评】+PWM测评

[复制链接]
884|0
 楼主| abner_ma 发表于 2023-7-1 20:33 | 显示全部楼层 |阅读模式
本帖最后由 abner_ma 于 2023-7-1 20:34 编辑


   杰发科技  AC7802x 虽然主频不太高,引脚也不多,但是随着深入研究发现其功能十分强大。支持 AEC-Q100 Grade 1,加上这一点足以藐视其他MCU。
24.jpg
   22.jpg
   PWM,英文名Pulse Width Modulation,是脉冲宽度调制缩写,它是通过对一系列脉冲的宽度进行调制,等效出所需要的波形(包含形状以及幅值),对模拟信号电平进行数字编码。
   杰发科技AC7802x PWM 模块强大,是一个多功能的定时器,支持输入捕获、输出比较、正交解码和 PWM 信号生成。PWM 的计数功能是通过一个 16 位的计数器产生的。该 MCU 设备包含 3 个 PWM 模块,其中 PWM0、PWM1模块支持 2 通道,PWM2 模块支持 4 通道 。
    PWM是芯片中的比较重要的功能,做电机控制会用到PWM与互补PWM,使用SVPWM时会使用中心对齐模式PWM,也叫做中央对齐模式PWM,而SVPWM是FOC矢量控制的基础,因此能不能产生中心对齐模式的PWM,便是判定一款芯片能不能使用FOC算法的依据,杰发科技  AC7802x 可以产生中心对齐模式的PWM,写FOC算法作复杂的电机控制完全可以


  PWM 特性包括:
PWM 时钟源为总线时钟
16 位预分频器支持 1 65536 分频
16 位计数器
它可以为一个自由运行、没有限制的计数器,或一个有初值和终值的计数器
支持向上、向上-向下两种计数方式
每个通道都可以配置为输入捕获、输出比较或边沿对齐 PWM 模式、中心对齐 PWM 模式
在输入捕获模式下,捕获可以发生在上升沿、下降沿或上升沿/下降沿
输入捕获模式下,所有通道均可以选择输入滤波器
在输出比较模式下, 可以在匹配时设置、清除或者翻转输出
每对通道都可以组合起来生成一个 PWM 信号,并且能够独立控制 PWM 信号的上升沿和下降
沿
PWM 通道可以采用具有同等输出或者互补输出的成对工作方式
死区插入可用于每一对组合通道,互补/非互补模式均可插入死区
可生成匹配触发
软件控制 PWM 输出
输出屏蔽可设置通道为无效状态
每个 PWM 模块的故障控制最多支持 3 路故障输入
每个通道的极性可配置
每个通道产生一个中断
计数器溢出时产生中断
当检测到故障条件时,产生中断



  PWM 结构框图:
PWM 每通道使用一个输入/输出(I / O)引脚、CHn(PWM 通道(n)),其中 n 是通道编号(PWM0、PWM1 中 n = 0/1 为两通道模块,PWM2 中 n = 0/1/2/3 为四通道模块)。PWM 的核心部分为 16 位计数器,具有可编程的初始值和最终值,其计数可以是向上或向上-向下。


QQ截图20230701201013.jpg

PWM配置:
  1. 时钟源
PWM_INIT 寄存器中的 CLKSRC 位选择 PWM 计数器的时钟源为 APB 时钟或者禁用 PWM 计数器。MCU 复位后,CLKSRC = 0,因此没有选择时钟源。通过将 CLKSRC 位写入 0 来禁用 PWM 计数器不会影响 PWM 计数器值或其他寄存器。
  2. 计数器
PWM 包含一个 16 位计数器,用于通道输入或输出模式。PWM 计数器时钟是由预分频器分频的选定时钟。PWM 计数器具有以下工作模式:
 向上计数
 向上-向下计数
 正交解码模式

  3.工作模式
PWM 可配置为输入捕获、输出比较或边沿对齐 PWM 模式、中心对齐 PWM 模式、组合模式、正交解码模式,详细配置参考以下表格。
2.jpg

21.jpg
引脚复用:
3.jpg

程序设计:
  1. void PWM1_OutputIndependent_Init(void)
  2. {
  3.     PWM_ConfigType config;
  4.     PWM_ModulationConfigType pwmConfig;
  5.     PWM_IndependentChConfig independentChConfig[2];

  6.     memset(&config, 0U, sizeof(config));
  7.     memset(&pwmConfig, 0U, sizeof(pwmConfig));
  8.     memset(&independentChConfig, 0U, sizeof(independentChConfig));

  9.     GPIO_SetFunc(GPIOB, GPIO_PIN0, GPIO_FUN2);  /* PB0--PWM1_CH1.该引脚只在32pin封装上有 */
  10.     GPIO_SetFunc(GPIOB, GPIO_PIN1, GPIO_FUN2);  /* PB1--PWM1_CH0,该引脚只在32pin封装上有.*/

  11.     /*
  12.     边沿对齐PWM模式:
  13.     周期=(MCVR-CNTIN+1)*PWM计数器时钟周期
  14.     脉宽=(CHnV-CNTIN+1)*PWM计数器时钟周期
  15.     中心对齐PWM模式:
  16.     周期=2*(MCVR-CNTIN)*PWM计数器时钟周期
  17.     脉宽=2*(CHnV-CNTIN)*PWM计数器时钟周期
  18.     */
  19.     independentChConfig[0].channel = PWM_CH_0;                         /*独立输出通道选择 */
  20.     independentChConfig[0].chValue = 3200 - 1;                         /*通道channel值,决定占空比,输出占空比 = chValue+1/config.maxValue+1 = 3200/16000= 20%*/
  21.     independentChConfig[0].levelMode = PWM_HIGH_TRUE;                  /*输出PWM高有效,可配置高有效或低有效 */
  22.     independentChConfig[0].polarity = PWM_OUTPUT_POLARITY_ACTIVE_HIGH; /*通道输出极性配置为高有效,PWM Mask后输出为低电平 */
  23.     independentChConfig[0].interruptEn = ENABLE;                       /*通道匹配中断使能位 */
  24.     independentChConfig[0].initLevel = PWM_LOW_LEVEL;                  /*通道初始电平输出配置,该配置受initChOutputEn控制,决定PMM计数器未工作前PWM口的输出电平 */
  25.     independentChConfig[0].triggerEn = DISABLE;                        /*通道匹配触发使能位,在通道值匹配时可产生触发信号用于其他模块的触发信号 */

  26.     independentChConfig[1].channel = PWM_CH_1;                         /*独立输出通道选择 */
  27.     independentChConfig[1].chValue = 8000 - 1;                         /*通道channel值,决定占空比,输出占空比 = chValue+1/config.maxValue+1 = 800/16000 = 50% */
  28.     independentChConfig[1].levelMode = PWM_HIGH_TRUE;                  /*输出PWM高有效,可配置高有效或低有效 */
  29.     independentChConfig[1].polarity = PWM_OUTPUT_POLARITY_ACTIVE_HIGH; /*通道输出极性配置为高有效,PWM Mask后输出为低电平 */
  30.     independentChConfig[1].interruptEn = ENABLE;                       /*通道匹配中断使能位 */
  31.     independentChConfig[1].initLevel = PWM_LOW_LEVEL;                  /*通道初始电平输出配置,该配置受initChOutputEn控制,决定PMM计数器未工作前PWM口的输出电平 */
  32.     independentChConfig[1].triggerEn = DISABLE;                        /*通道匹配触发使能位,在通道值匹配时可产生触发信号用于其他模块的触发信号 */

  33.     pwmConfig.countMode = PWM_UP_COUNT;                    /*PWM计数器模式,PWM_UP_COUNT--向上计数模式;PWM_UP_DOWN_COUNT-- 向上/向下计数模式 */
  34.     pwmConfig.independentChannelNum = 2;                   /*独立通道数目*/
  35.     pwmConfig.combineChannelNum = 0;                       /*组合通道对数 */
  36.     pwmConfig.independentChConfig = independentChConfig;   /*独立通道配置赋值 */
  37.     pwmConfig.combineChConfig = NULL;                      /*组合通道配置赋值 */
  38.     pwmConfig.deadtime = 0;                                /*死区时间值,死区功能仅在组合模式下有效  */
  39.     pwmConfig.deadtimePsc = PWM_DEADTIME_DIVID_1;          /*死区时间时钟分频系数,死区功能仅在组合模式下有效 */
  40.     pwmConfig.initChOutputEn = ENABLE;                     /*初始化通道输出使能位,使能后独立PWM模式的 initLevel 和组合模式的ch1stInitLevel和ch2ndInitLevel配置才会生效*/
  41.     pwmConfig.initTriggerEn = DISABLE;                     /*PWM初始值触发使能位 */

  42.     /*
  43.     向上计数模式下,频率计算为:
  44.     freq = pwm_clk/(maxValue - initValue +1))
  45.     16000000/(16000-1+1) = 1K
  46.     */
  47.     config.mode = PWM_MODE_MODULATION;            /*PWM模式配置,PWM_MODE_MODULATION--PWM调制模式 */
  48.     config.initModeStruct = &pwmConfig;           /*不同模式相应初始化配置结构体赋值 */
  49.     config.clkSource = PWM_CLK_SOURCE_APB;        /*PWM时钟源选择 */
  50.     config.clkPsc = 0;                            /*时钟分频系数 */
  51.     config.initValue = 0;                         /*初始计数值 */
  52.     config.maxValue = 16000 - 1;                  /*最大计数值,决定输出波形频率 */
  53.     config.overflowInterrupEn = ENABLE;           /*溢出中断使能位 */
  54.     config.cntOverflowFreq = 0;                   /*溢出中断产生的频率与计数器频率的关系,0表示每次计数器溢出都产生中断,1表示间隔一次,以此类推 */
  55.     config.interruptEn = ENABLE;                  /*PWM总中断使能位  */
  56.     config.callBack = PWM1_Callback;              /*中断回调函数 */

  57.     PWM_Init(PWM1, &config);

  58. }

  59. /*!
  60. * [url=home.php?mod=space&uid=247401]@brief[/url]   PWM2_OutputIndependent_Init
  61. *          PWM2模块初始化,PWM2_CH0和PWM2_CH1配置为独立通道输出PWM,向上/向下计数模式,频率为1KHz,CH0占空比为20%,CH1占空比为50%
  62. * @param   none
  63. * [url=home.php?mod=space&uid=266161]@return[/url]  none
  64. */
  65. void PWM2_OutputIndependent_Init(void)
  66. {
  67.     PWM_ConfigType config;
  68.     PWM_ModulationConfigType pwmConfig;
  69.     PWM_IndependentChConfig independentChConfig[2];

  70.     memset(&config, 0U, sizeof(config));
  71.     memset(&pwmConfig, 0U, sizeof(pwmConfig));
  72.     memset(&independentChConfig, 0U, sizeof(independentChConfig));

  73.     GPIO_SetFunc(GPIOA, GPIO_PIN2, GPIO_FUN1); /* PA2--PWM2_CH1.*/
  74.     GPIO_SetFunc(GPIOA, GPIO_PIN3, GPIO_FUN1); /* PA3--PWM2_CH0.*/

  75.     /*
  76.     边沿对齐PWM模式:
  77.     周期=(MCVR-CNTIN+1)*PWM计数器时钟周期
  78.     脉宽=(CHnV-CNTIN+1)*PWM计数器时钟周期
  79.     中心对齐PWM模式:
  80.     周期=2*(MCVR-CNTIN)*PWM计数器时钟周期
  81.     脉宽=2*(CHnV-CNTIN)*PWM计数器时钟周期
  82.     */
  83.     independentChConfig[0].channel = PWM_CH_0;                         /*独立输出通道选择 */
  84.     independentChConfig[0].chValue = 1600;                             /*通道channel值,决定占空比 */
  85.     independentChConfig[0].levelMode = PWM_HIGH_TRUE;                  /*输出PWM高有效,可配置高有效或低有效 */
  86.     independentChConfig[0].polarity = PWM_OUTPUT_POLARITY_ACTIVE_HIGH; /*通道输出极性配置为高有效,PWM Mask后输出为低电平 */
  87.     independentChConfig[0].interruptEn = ENABLE;                       /*通道匹配中断使能位 */
  88.     independentChConfig[0].initLevel = PWM_LOW_LEVEL;                  /*通道初始电平输出配置,该配置受initChOutputEn控制,决定PMM计数器未工作前PWM口的输出电平 */
  89.     independentChConfig[0].triggerEn = DISABLE;                        /*通道匹配触发使能位,在通道值匹配时可产生触发信号用于其他模块的触发信号 */

  90.     independentChConfig[1].channel = PWM_CH_1;                         /*独立输出通道选择 */
  91.     independentChConfig[1].chValue = 4000;                             /*通道channel值,决定占空比 */
  92.     independentChConfig[1].levelMode = PWM_HIGH_TRUE;                  /*输出PWM高有效,可配置高有效或低有效 */
  93.     independentChConfig[1].polarity = PWM_OUTPUT_POLARITY_ACTIVE_HIGH; /*通道输出极性配置为高有效,PWM Mask后输出为低电平 */
  94.     independentChConfig[1].interruptEn = ENABLE;                       /*通道匹配中断使能位 */
  95.     independentChConfig[1].initLevel = PWM_LOW_LEVEL;                  /*通道初始电平输出配置,该配置受initChOutputEn控制,决定PMM计数器未工作前PWM口的输出电平 */
  96.     independentChConfig[1].triggerEn = DISABLE;                        /*通道匹配触发使能位,在通道值匹配时可产生触发信号用于其他模块的触发信号 */

  97.     pwmConfig.countMode = PWM_UP_DOWN_COUNT;               /*PWM计数器模式,PWM_UP_COUNT--向上计数模式;PWM_UP_DOWN_COUNT-- 向上/向下计数模式 */
  98.     pwmConfig.independentChannelNum = 2;                   /*独立通道数目*/
  99.     pwmConfig.combineChannelNum = 0;                       /*组合通道对数 */
  100.     pwmConfig.independentChConfig = independentChConfig;   /*独立通道配置赋值 */
  101.     pwmConfig.combineChConfig = NULL;                      /*组合通道配置赋值 */
  102.     pwmConfig.deadtime = 0;                                /*死区时间值,死区功能仅在组合模式下有效  */
  103.     pwmConfig.deadtimePsc = PWM_DEADTIME_DIVID_1;          /*死区时间时钟分频系数,死区功能仅在组合模式下有效 */
  104.     pwmConfig.initChOutputEn = ENABLE;                     /*初始化通道输出使能位,使能后独立PWM模式的 initLevel 和组合模式的ch1stInitLevel和ch2ndInitLevel配置才会生效*/
  105.     pwmConfig.initTriggerEn = DISABLE;                     /*PWM初始值触发使能位 */

  106.     /*
  107.     向上-向下技术模式下,频率计算为:
  108.     freq = pwm_clk/(2*(maxValue - initValue))
  109.     16000/(2*8000) = 1K
  110.     */
  111.     config.mode = PWM_MODE_MODULATION;            /*PWM模式配置,PWM_MODE_MODULATION--PWM调制模式 */
  112.     config.initModeStruct = &pwmConfig;           /*不同模式相应初始化配置结构体赋值 */
  113.     config.clkSource = PWM_CLK_SOURCE_APB;        /*PWM时钟源选择 */
  114.     config.clkPsc = 0;                            /*时钟分频系数 */
  115.     config.initValue = 0;                         /*初始计数值 */
  116.     config.maxValue = 8000;                       /*最大计数值,决定输出波形频率 */
  117.     config.overflowInterrupEn = ENABLE;           /*溢出中断使能位 */
  118.     config.cntOverflowFreq = 0;                   /*溢出中断产生的频率与计数器频率的关系,0表示每次计数器溢出都产生中断,1表示间隔一次,以此类推 */
  119.     config.interruptEn = ENABLE;                  /*PWM总中断使能位  */
  120.     config.callBack = PWM2_Callback;              /*中断回调函数 */

  121.     PWM_Init(PWM2, &config);

  122. }

25.jpg







您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:项目经理
简介:资深嵌入式开发工程师

104

主题

191

帖子

3

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