[活动专区] 【AutoChips 7801x MCU评测报告】+PWM

[复制链接]
1119|4
 楼主| Cjy_JDxy 发表于 2020-6-10 18:55 | 显示全部楼层 |阅读模式
今天搞了一下PWM。
PB5,PB4,PC9,PB3
原理图:
1.jpg


2.jpg
代码:
  1. #include "ac780x.h"
  2. #include "ac780x_debugout.h"
  3. #include "pwm_sample.h"

  4. /**********<Macro>**********/

  5. /**********<Union>**********/

  6. /**********<Struct>*********/

  7. /*********<Variable>********/

  8. /********<Prototype>********/

  9. /**
  10. *
  11. * @param[in] none
  12. *
  13. * [url=home.php?mod=space&uid=266161]@return[/url] none
  14. *
  15. * [url=home.php?mod=space&uid=247401]@brief[/url]
  16. */
  17. int main(void)
  18. {
  19.     InitDebug();
  20.     InitDelay();
  21.     printf("\nRunning the PWM module sample code.\r\n");
  22.     PWM_GpioInit();
  23.     PWM1_GenerateFrequency();
  24.     while (1)
  25.     {

  26.    
  27.     }
  28. }

  29. /**********<End>*********/
  1. void PWM_GpioInit(void)
  2. {

  3.     //配置GPIO为PWM
  4.     //config PWM1 pinmux
  5.     GPIO_SetFunc(GPIOB, GPIO_PIN5, GPIO_FUN1);//PWM1_CH0
  6.     GPIO_SetFunc(GPIOB, GPIO_PIN4, GPIO_FUN1);//PWM1_CH1
  7.     GPIO_SetFunc(GPIOC, GPIO_PIN9, GPIO_FUN1);//PWM1_CH6
  8.     GPIO_SetFunc(GPIOB, GPIO_PIN3, GPIO_FUN2);//PWM1_CH7
  9. }
  10. /**
  11. * PWM1_GenerateFrequency
  12. *
  13. * @param[in] none
  14. * @return none
  15. *
  16. * @brief
  17. * 1.PWM1_CH0,PWM1_CH1组合模式,PWM1_CH0输出频率为20K,占空比为25%的波形,PWM1_CH1与PWM1_CH0波形互补,带1us死区插入。
  18. * 2.PWM1_CH6,PWM1_CH7独立PWM模式(边沿对齐),生成频率为20K,PWM1_CH6占空比50%,PWM1_CH7占空比25%的波形。
  19. * 3.PWM计数器溢出中断,对输出PWM波进行计数
  20. *
  21. */
  22. void PWM1_GenerateFrequency(void)
  23. {
  24.     PWM_CombineChConfig combineChConfig[1]; //组合模式相关结构体
  25.     PWM_IndependentChConfig independentChConfig[2];//独立模式相关结构体
  26.     PWM_ModulationConfigType pwmConfig; //PWM模式相关结构体
  27.     PWM_ConfigType config; //PWM模块结构体
  28.     //结构体数据清零
  29.     memset(&combineChConfig, 0, sizeof(combineChConfig));
  30.     memset(&independentChConfig, 0, sizeof(independentChConfig));
  31.     memset(&pwmConfig, 0, sizeof(pwmConfig));
  32.     memset(&config, 0, sizeof(config));
  33.    
  34.     /*通道0/1配成组合模式PWM输出*/
  35.     /*
  36.     向上计数组合模式:
  37.     周期=(MCVR-CNTIN+1)*PWM计数器时钟周期
  38.     占空比=|CH(n+1)V-CH(n)V|*PWM计数器时钟周期
  39.     向上-向下计数组合模式:
  40.     周期=2*(MCVR-CNTIN)*PWM计数器时钟周期
  41.     占空比=2*(|CH(n+1)V-CH(n)V|)*PWM计数器时钟周期
  42.     */
  43.     combineChConfig[0].pairChannel = PWM_CH_0; //PWM通道对数,PWM_CH_0/2/4/6对应PAIR0/1/2/3
  44.     /*
  45.     组合模式占空比由ch1stValue,ch2ndValue共同决定,pwmConfig.countMode配为PWM_UP_COUNT(计数器向上计数)时,占空比为:(ch1stValue-ch2ndValue)/(config.maxValue + 1)
  46.     */
  47.     combineChConfig[0].ch1stValue = MOD_PWM >> 2; //通道2n channel值,n为PWM对数编号
  48.     combineChConfig[0].ch2ndValue = MOD_PWM >> 1; //通道2n+1 channel值,n为PWM对数编号
  49.     combineChConfig[0].levelMode = PWM_HIGH_TRUE; //输出PWM高有效,如果占空比设为25%,是指的高有效电平占比25%
  50.     combineChConfig[0].deadtimeEn = ENABLE;//死区插入使能,组合模式才支持死区插入
  51.     combineChConfig[0].complementEn = ENABLE;//互补模式使能,使能后,PWM通道波形互补,DISABLE波形输出同向
  52.     combineChConfig[0].ch1stMatchDir = PWM_MATCH_DIR_DOWN;//仅在向上-向下计数(countMode为PWM_UP_DOWN_COUNT)组合模式有效,用于选择匹配生效点方向
  53.     combineChConfig[0].ch2ndMatchDir = PWM_MATCH_DIR_DOWN;//仅在向上-向下计数(countMode为PWM_UP_DOWN_COUNT)组合模式有效,用于选择匹配生效点方向
  54.     combineChConfig[0].ch1stPolarity = PWM_OUTPUT_POLARITY_ACTIVE_HIGH;//输出极性高有效,PWM mask后PWM输出低电平
  55.     combineChConfig[0].ch2ndPolarity = PWM_OUTPUT_POLARITY_ACTIVE_HIGH;//输出极性高有效,PWM mask后PWM输出低电平
  56.     combineChConfig[0].ch1stInterruptEn = DISABLE;//PWM通道匹配中断使能位
  57.     combineChConfig[0].ch2ndInterruptEn = DISABLE;//PWM通道匹配中断使能位
  58.     combineChConfig[0].ch1stInitLevel = PWM_LOW_LEVEL;//PWM初始电平输出为低,该配置受initChOutputEn控制,决定PWM计数器未工作前PWM口的输出电平值。
  59.     combineChConfig[0].ch2ndInitLevel = PWM_LOW_LEVEL;//PWM初始电平输出为低,该配置受initChOutputEn控制,决定PWM计数器未工作前PWM口的输出电平值。
  60.     combineChConfig[0].ch1stTriggerEn = DISABLE;//通道2n外部触发使能,n为PWM对数编号
  61.     combineChConfig[0].ch2ndTriggerEn = DISABLE;//通道2n+1外部触发使能,n为PWM对数编号
  62.     /*
  63.     边沿对齐PWM模式:
  64.     周期=(MCVR-CNTIN+1)*PWM计数器时钟周期
  65.     占空比=(CHnV-CNTIN+1)*PWM计数器时钟周期
  66.     中心对齐PWM模式:
  67.     周期=2*(MCVR-CNTIN)*PWM计数器时钟周期
  68.     占空比=2*(CH(n)V-CNTIN)*PWM计数器时钟周期
  69.     */
  70.     /*channel 6*/
  71.     independentChConfig[0].channel = PWM_CH_6; //通道6
  72.     independentChConfig[0].chValue = MOD_PWM >> 1;//通道6 channel值,输出占空比 = chValue / (config.maxValue + 1) = 50%
  73.     independentChConfig[0].levelMode = PWM_HIGH_TRUE; //输出PWM高有效
  74.     independentChConfig[0].polarity = PWM_OUTPUT_POLARITY_ACTIVE_HIGH; //输出极性高有效,PWM mask后PWM输出低电平
  75.     independentChConfig[0].interruptEn = DISABLE;//PWM通道匹配中断使能位
  76.     independentChConfig[0].initLevel = PWM_LOW_LEVEL;//PWM初始电平输出为低,该配置受initChOutputEn控制,决定PWM计数器未工作前PWM口的输出电平值。
  77.     independentChConfig[0].triggerEn = DISABLE;//通道外部触发使能
  78.     /*channel 7*/
  79.     independentChConfig[1].channel = PWM_CH_7; //通道7
  80.     independentChConfig[1].chValue = MOD_PWM >> 2;//通道7 channel值,输出占空比 = chValue / (config.maxValue + 1) = 25%
  81.     independentChConfig[1].levelMode = PWM_HIGH_TRUE; //输出PWM高有效
  82.     independentChConfig[1].polarity = PWM_OUTPUT_POLARITY_ACTIVE_HIGH; //输出极性高有效,PWM mask后PWM输出低电平
  83.     independentChConfig[1].interruptEn = DISABLE;//PWM通道匹配中断使能位
  84.     independentChConfig[1].initLevel = PWM_LOW_LEVEL;//PWM初始电平输出为低,该配置受initChOutputEn控制,决定PWM计数器未工作前PWM口的输出电平值。
  85.     independentChConfig[1].triggerEn = DISABLE;//通道外部触发使能

  86.     /*modulation mode config*/
  87.     pwmConfig.countMode = PWM_UP_COUNT; //PWM计数器模式 (不同的计数模式频率及占空比计算方式不同)
  88.     pwmConfig.independentChannelNum = 2; //独立通道数
  89.     pwmConfig.combineChannelNum = 1; //组合对数
  90.     pwmConfig.independentChConfig = independentChConfig; //独立通道配置变量地址赋值
  91.     pwmConfig.combineChConfig = combineChConfig; //组合通道配置变量地址赋值
  92.     pwmConfig.deadtimePsc = PWM_DEADTIME_DIVID_1;//死区插入分频值,与deadtime一起决定插入死区的时间。
  93.     pwmConfig.deadtime = 24;  //死区时间 = (DTPSC * DTVAL)/PWM计数器时钟周期 = 1*24/24000000 = 1us
  94.     pwmConfig.initChOutputEn = ENABLE; //使能初始化通道输出,使能后独立PWM模式的initLevel和组合PWM模式的ch1stInitLevel和ch2ndPolarity配置才会生效
  95.     pwmConfig.initTriggerEn = DISABLE; //通道外部触发使能
  96.    
  97.     /*pwm config*/
  98.     config.mode = PWM_MODE_MODULATION;//PWM模块配置为PWM模式
  99.     config.initModeStruct = &pwmConfig;//PWM配置结构体地址赋值
  100.     config.clkSource = PWM_CLK_SOURCE_APB; //PWM时钟源配置
  101.     config.clkPsc = PWM_PRES;//PWM时钟源分频
  102.     config.initValue = 0;//计数器初始寄存器值
  103.     config.maxValue = MOD_PWM - 1; //PWM计数器最大值
  104.     config.overflowInterrupEn = ENABLE;//计数器溢出中断使能
  105.     config.cntOverflowFreq = 0;//CNTOF中断产生的频率与计数器频率的关系(0-127), 0表示每次计数器溢出都产生溢出中断,1表示间隔1次,2表示间隔2次,以此内推。
  106.     config.interruptEn = ENABLE; //PWM中断使能
  107.     config.callBack = PWM1_CallBack; //PWM中断回调
  108.    
  109.     PWM_Init(PWM1, &config); //配置初始化生效

  110.     NVIC_SetPriority(PWM1_IRQn, 0); //设置PWM模块中断的优先级
  111. }
  112. /**********<End>*********/
效果图:
PB3:
5.jpg
PC9:
6.jpg
7.jpg




marginer 发表于 2020-6-10 18:59 | 显示全部楼层
不上班天天搞机
 楼主| Cjy_JDxy 发表于 2020-6-10 19:15 | 显示全部楼层

我上班啊
叶春勇 发表于 2020-6-10 20:57 | 显示全部楼层
不错楼主,我的板子也到了,先看看
marginer 发表于 2020-6-12 14:54 | 显示全部楼层

上班用这MCU上几个项目卖一下
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:绿水本无忧因风皱面,青山原不老为雪白头。

553

主题

3530

帖子

20

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