[学习笔记] 【杰发科技AC7802x测评】之五 定时器捕获功能测评

[复制链接]
 楼主| abner_ma 发表于 2023-7-2 21:10 | 显示全部楼层 |阅读模式
<
本帖最后由 abner_ma 于 2023-7-2 21:13 编辑

杰发科技AC7802x TIMER 模块功能强大:
定时器能够生成中断
定时器能够生成触发脉冲
每个定时器都具有独立的超时周期
支持 4 32bit 定时器
支持链( Link) 模式
0.jpg


捕获功能是高级定时器的重要功能之一。工作原理:在输入捕获模式下,当捕获单元捕捉到外部信号的有效边沿(上升沿/下降 沿/双边沿)时,将计数器的当前值锁存到捕获/比较寄存器TIMx_CCR, 供用户读取。用途:用于测量脉冲信号PWM参数,比如周期和频率,占空比等关键参数。
程序设计:


  1. /******************************************************************************
  2. * @version: V1.0.0  demo
  3. ******************************************************************************/

  4. /*!
  5. * [url=home.php?mod=space&uid=288409]@file[/url] timer_capture_pwm.c
  6. *
  7. * [url=home.php?mod=space&uid=247401]@brief[/url] 定时器捕捉PWM配置源文件
  8. *
  9. */

  10. /* ===========================================  Includes  =========================================== */
  11. #include "string.h"
  12. #include "ac780x_timer.h"
  13. #include "ac780x_timer_reg.h"
  14. #include "ac780x_gpio.h"
  15. #include "ac780x_pwm.h"  
  16. #include "timer_capture_pwm.h"

  17. /* ============================================  Define  ============================================ */
  18. #define APB_CLK         (APB_BUS_FREQ)                     /*! APB时钟定义 */
  19. #define FREQ            (1000)                             /*! 频率为1k */
  20. #define PWM_PRES        (0)                                /*! PWM预分频 */
  21. #define MOD_PWM         (APB_CLK / FREQ / (PWM_PRES + 1))  /*! PWM模值 */

  22. /* ===========================================  Typedef  ============================================ */


  23. /* ==========================================  Variables  =========================================== */
  24. uint32_t g_pwm_DownMomentOne = 0;           /* PWM波第一次出现下降沿 */
  25. uint32_t g_pwm_DownMomentTwo = 0;           /* PWM波第二次出现下降沿 */
  26. uint32_t g_pwm_UpMoment = 0;                /* PWM波上升沿降沿 */
  27. uint32_t g_pwm_Period = 0;                  /* PWM频率 */
  28. uint32_t g_pwm_Duty = 0;                    /* PWM占空比 */

  29. /* ====================================  Functions declaration  ===================================== */


  30. /* ======================================  Functions define  ======================================== */

  31. /*!
  32. *
  33. * [url=home.php?mod=space&uid=247401]@brief[/url] 初始化TIMER0,产生100s计时
  34. *
  35. * @param[in] none
  36. * [url=home.php?mod=space&uid=266161]@return[/url] none
  37. */
  38. void Timer0_Init(void)
  39. {
  40.     TIMER_ConfigType  timerConfig0;
  41.    
  42.     memset(&timerConfig0, 0, sizeof(timerConfig0));
  43.    
  44.     /* TIMER0配置函数 */
  45.     timerConfig0.periodValue = DelayS(100);                  /*! 100s计时 */
  46.     timerConfig0.interruptEn = DISABLE;                      /*! 禁能定时器中断 */
  47.     timerConfig0.linkModeEn = DISABLE;                       /*! 禁能链接模式 */
  48.     timerConfig0.timerEn = DISABLE;                          /*! 先关掉定时器,在PWM第一个下降沿开,第二个下降沿关闭,以使得计时时间更精确,具体位置在GPIO中断处理函数中 */
  49.     timerConfig0.callBack = NULL;                            /*! 回调函数为空 */

  50.     TIMER_Init(TIMER_CHANNEL0, &timerConfig0);               /*! TIMER初始化函数生效 */
  51.     mdelay(10);                                              /*! 防止在定时器溢出后产生误差 */
  52. }

  53. /**
  54. *
  55. * @brief GPIO中断处理函数
  56. *
  57. * @param  device:
  58. * GPIOx: GPIO type structure pointer:
  59. *   -GPIOA
  60. *   -GPIOB
  61. * wpara:
  62. * GPIO_Pin: GPIO_Pin type num:
  63. *   -GPIO_PIN0
  64. *   -GPIO_PIN1
  65. *   -GPIO_PIN2
  66. *   - ...
  67. *   -GPIO_PIN15
  68. * lpara:0
  69. *         [url=home.php?mod=space&uid=266161]@return[/url] none
  70. *
  71. */
  72. void PWM_Capture_ByTimer(void *device, uint32_t wpara, uint32_t lpara)
  73. {
  74.     static uint8_t pwm_EdgCount = 0;
  75.    
  76.     if(pwm_EdgCount  == 0)
  77.     {
  78.         TIMER_SetChannel(TIMER_CHANNEL0, ENABLE);                                     /*! 此处打开定时器 */
  79.         if (GPIO_GetPinLevel(GPIOA,GPIO_PIN1) == 0)                                   /*! PWM下降沿 */
  80.         {
  81.             g_pwm_DownMomentOne = TIMER_GetCurrentValue(TIMER_CHANNEL0);
  82.             pwm_EdgCount = 1;
  83.         }
  84.     }
  85.     else if(pwm_EdgCount  == 1)
  86.     {
  87.         if (GPIO_GetPinLevel(GPIOA,GPIO_PIN1) == 1)                                  /*! PWM上升沿 */
  88.         {
  89.             g_pwm_UpMoment = TIMER_GetCurrentValue(TIMER_CHANNEL0);
  90.             pwm_EdgCount = 2;
  91.         }
  92.     }
  93.     else if(pwm_EdgCount  == 2)
  94.     {
  95.         if(GPIO_GetPinLevel(GPIOA,GPIO_PIN1) == 0)                                   /*! PWM下降沿 */
  96.         {
  97.            TIMER_SetChannel(TIMER_CHANNEL0, DISABLE);                                /*!此处关闭定时器 */
  98.            g_pwm_DownMomentTwo = TIMER_GetCurrentValue(TIMER_CHANNEL0);        
  99.             pwm_EdgCount = 0;
  100.         }
  101.     }
  102.    
  103.     if((g_pwm_UpMoment < g_pwm_DownMomentOne)&&(g_pwm_DownMomentTwo < g_pwm_UpMoment))                                 /*! Timer为向下计数 */
  104.     {
  105.         g_pwm_Period = (g_pwm_DownMomentOne - g_pwm_DownMomentTwo)/16;                                                 /*! 16个计数为1us */
  106.         g_pwm_Duty = (100 * (g_pwm_UpMoment - g_pwm_DownMomentTwo))/(g_pwm_DownMomentOne - g_pwm_DownMomentTwo);
  107.     }
  108. }

  109. /*!
  110. * @brief  初始化PWM捕获GPIO
  111. *
  112. * @param[in] none
  113. * @return none
  114. */
  115. void Capture_Gpio_Init(void)
  116. {   
  117.     GPIO_SetFunc(GPIOA,GPIO_PIN1,GPIO_FUN0);                                /*! PA1引脚配置为GPIO模式,用于采集端口 */
  118.    
  119.     GPIO_SetDir(GPIOA,GPIO_PIN1,GPIO_IN);                                   /*! PA1引脚配置为输入模式,用于采集端口 */
  120.    
  121.     GPIO_EnableExtInterrupt(GPIOA,GPIO_PIN1, EXTI_TRIGGER_RISING_FALLING);  /*! 使能外部中断,上升沿下降沿都中断 */
  122.    
  123.     GPIO_SetCallback(GPIO_PIN1, PWM_Capture_ByTimer);                       /*! 设置中断回调函数 */
  124. }

  125. /**
  126. *
  127. * @brief PA2,PWM2_CH1,PMW输出频率为1K,占空比为25%
  128. *
  129. * @param[in] none
  130. * @return    none
  131. */
  132. void PWM_Generate(void)
  133. {
  134.     GPIO_SetFunc(GPIOA, GPIO_PIN2, GPIO_FUN1);                             /*! PWM2_CH0 */

  135.     PWM_IndependentChConfig independentChConfig[1];                        /*! 独立模式相关结构体 */
  136.     PWM_ModulationConfigType pwmConfig;                                    /*! PWM模式相关结构体 */
  137.     PWM_ConfigType config;                                                 /*! PWM模块结构体 */
  138.    
  139.     memset(&independentChConfig, 0, sizeof(independentChConfig));
  140.     memset(&pwmConfig, 0, sizeof(pwmConfig));
  141.     memset(&config, 0, sizeof(config));

  142.     independentChConfig[0].channel = PWM_CH_1;                             /*! 通道1 */
  143.     independentChConfig[0].chValue = MOD_PWM >> 2;                         /*! 通道1 channel值,输出占空比 = chValue / maxValue = 25%  */
  144.     independentChConfig[0].levelMode = PWM_HIGH_TRUE;                      /*! 输出PWM高有效 */
  145.     independentChConfig[0].polarity = PWM_OUTPUT_POLARITY_ACTIVE_HIGH;     /*! 输出极性高有效,PWM mask后PWM输出低电平 */
  146.     independentChConfig[0].interruptEn = DISABLE;                          /*! PWM通道匹配中断使能位 */
  147.     independentChConfig[0].initLevel = PWM_LOW_LEVEL;                      /*! PWM初始电平输出为低,该配置受initChOutputEn控制,决定PWM计数器未工作前PWM口的输出电平值 */
  148.     independentChConfig[0].triggerEn = DISABLE;                            /*! 通道外部触发使能 */
  149.    
  150.     /*! modulation mode config */
  151.     pwmConfig.countMode = PWM_UP_COUNT;                                    /*! PWM计数器模式 (不同的计数模式频率及占空比计算方式不同) */
  152.     pwmConfig.independentChannelNum = 1;                                   /*! 独立通道数 */
  153.     pwmConfig.combineChannelNum = 0;                                       /*! 组合对数 */
  154.     pwmConfig.independentChConfig = independentChConfig;                   /*! 独立通道配置变量地址赋值 */
  155.     pwmConfig.initChOutputEn = ENABLE;                                     /*! 使能初始化通道输出 */
  156.     pwmConfig.initTriggerEn = DISABLE;                                     /*! 通道外部触发使能 */
  157.    
  158.     /*! pwm config */
  159.     config.mode = PWM_MODE_MODULATION;                                     /*! PWM模块配置为PWM模式 */
  160.     config.initModeStruct = &pwmConfig;                                    /*! PWM配置结构体地址赋值 */
  161.     config.clkSource = PWM_CLK_SOURCE_APB;                                 /*! PWM时钟源配置 */
  162.     config.clkPsc = PWM_PRES;                                              /*! PWM时钟源分频 */
  163.     config.initValue = 0;                                                  /*! 计数器初始寄存器值 */
  164.     config.maxValue = MOD_PWM - 1;                                         /*! PWM计数器最大值 */
  165.     config.overflowInterrupEn = DISABLE;                                   /*! 计数器溢出中断禁能 */
  166.     config.cntOverflowFreq = 0;                                            /*! CNTOF中断产生的频率与计数器频率的关系(0-127), 0表示每次计数器溢出都产生溢出中断,1表示间隔1次,2表示间隔2次,以此类推 */
  167.     config.interruptEn = DISABLE;                                          /*! PWM中断使能 */
  168.    
  169.     PWM_Init(PWM2, &config);                                               /*! 配置初始化生效 */
  170. }

  171. /*!
  172. * @brief      PWM捕捉函数
  173. *
  174. * @param[in]  none
  175. * @return     none
  176. */

  177. void TIMER_PWM_Capture(void)
  178. {
  179.     Capture_Gpio_Init();                                                   /*! 初始化PWM捕获GPIO */
  180.     Timer0_Init();                                                         /*! 定时器配置函数 */
  181.     PWM_Generate();                                                        /*! PWM输出函数 */
  182. }
1、 通过 Timer 实现 GPIO 捕获 PWM 频率及占空比
2、 例程中将 PA2 设置为 PWM 口, 输出频率为 1KHz, 占空 比为 25%的 PWM;
3、 将 PA1 设置成 GPIO 口, 使能 GPIO 中断, 设置为 EXTI_TRIGGER_RISING_FALLING, 上升沿下降沿都产 生中断;
4、 将 PA2 与 PA1 连接测试如下:调试debug:
   测评结果:精度范围内符合设计值。


1.jpg


2.jpg






评论

太过专业,围观了解一下。  发表于 2023-7-2 21:51
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

95

主题

181

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部
认证:项目经理
简介:资深嵌入式开发工程师

95

主题

181

帖子

3

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