[APM32E1] 基于E103控制一段时间波形输出个数

[复制链接]
678|0
 楼主| hexbei 发表于 2024-1-5 17:27 | 显示全部楼层 |阅读模式
本帖最后由 hexbei 于 2024-1-5 17:27 编辑


        在某天遇到一个需求,需要同时输出3个不同频宽的的PWM输出。同时,而且一个时间段内,我只需要3个PWM的波形。似乎有点不太可能,接下来先分析一波:

        1、需要同时输出3个PWM输出,那么意味着只有同一个定时器的3个通道输出PWM才能实现。

        2、如果是需要同一个定时器的3通道PWM,那么如果这3个波形的周期都是10us,那么我只需要调整3个通道的占空比,那么就能够实现。
image-20240105162252-g13yvk4.png

        3、那么问题的重点是如何控制一段时间内的波形个数呢?



1、首先我们先简单的写一个2通道PWM波形输出(通道一为周期10us秒,占空比20  通道二为占空比50)   
  1. GPIO_Config_T GPIO_ConfigStruct;

  2.     TMR_BaseConfig_T TMR_TimeBaseStruct;

  3.     TMR_OCConfig_T OCcongigStruct;



  4.     RCM_EnableAPB2PeriphClock((RCM_APB2_PERIPH_T)(RCM_APB2_PERIPH_GPIOA | RCM_APB2_PERIPH_TMR1 | RCM_APB2_PERIPH_GPIOB));



  5.     GPIO_ConfigStruct.pin = GPIO_PIN_8;

  6.     GPIO_ConfigStruct.mode = GPIO_MODE_AF_PP;

  7.     GPIO_ConfigStruct.speed = GPIO_SPEED_50MHz;

  8.     GPIO_Config(GPIOA, &GPIO_ConfigStruct);



  9.                 GPIO_ConfigStruct.pin = GPIO_PIN_9;

  10.     GPIO_ConfigStruct.mode = GPIO_MODE_AF_PP;

  11.     GPIO_ConfigStruct.speed = GPIO_SPEED_50MHz;

  12.     GPIO_Config(GPIOA, &GPIO_ConfigStruct);



  13.     TMR_TimeBaseStruct.clockDivision = TMR_CLOCK_DIV_1;

  14.     TMR_TimeBaseStruct.countMode = TMR_COUNTER_MODE_UP;

  15.     TMR_TimeBaseStruct.division = 71;

  16.     TMR_TimeBaseStruct.period = 10;

  17.     TMR_ConfigTimeBase(TMR1, &TMR_TimeBaseStruct);



  18.     OCcongigStruct.idleState = TMR_OC_IDLE_STATE_RESET;

  19.     OCcongigStruct.mode = TMR_OC_MODE_PWM1;

  20.     OCcongigStruct.nIdleState = TMR_OC_NIDLE_STATE_RESET;

  21.     OCcongigStruct.nPolarity = TMR_OC_NPOLARITY_HIGH;

  22.     OCcongigStruct.outputNState = TMR_OC_NSTATE_ENABLE;

  23.     OCcongigStruct.outputState = TMR_OC_STATE_ENABLE;

  24.     OCcongigStruct.polarity = TMR_OC_POLARITY_HIGH;

  25.     OCcongigStruct.pulse = 5;

  26.     TMR_ConfigOC1(TMR1, &OCcongigStruct);


  27.                 OCcongigStruct.idleState = TMR_OC_IDLE_STATE_RESET;

  28.     OCcongigStruct.mode = TMR_OC_MODE_PWM1;

  29.     OCcongigStruct.nIdleState = TMR_OC_NIDLE_STATE_RESET;

  30.     OCcongigStruct.nPolarity = TMR_OC_NPOLARITY_HIGH;

  31.     OCcongigStruct.outputNState = TMR_OC_NSTATE_ENABLE;

  32.     OCcongigStruct.outputState = TMR_OC_STATE_ENABLE;

  33.     OCcongigStruct.polarity = TMR_OC_POLARITY_HIGH;

  34.     OCcongigStruct.pulse = 2;

  35.     TMR_ConfigOC2(TMR1, &OCcongigStruct);



  36.     TMR_ConfigOC1Preload(TMR1, TMR_OC_PRELOAD_ENABLE);

  37.     TMR_EnableAutoReload(TMR1);

  38.     TMR_Enable(TMR1);

  39.     TMR_EnablePWMOutputs(TMR1);
image-20240105170720-zphwdha.png





2、我们尝试使用第二个定时器,10us进入一次中断,每次中断计数一次。那么我们只需要在计数3(30us的时候关闭PWM输出),计数10(100us)的时候清零且打开PWM的输出,是否能够实现100us内仅输出3个波形。

        a、定时器5的配置
  1. TMR_BaseConfig_T TMR_BaseConfigStruct;



  2.     RCM_EnableAPB1PeriphClock(RCM_APB1_PERIPH_TMR5);



  3.     TMR_BaseConfigStruct.clockDivision = TMR_CLOCK_DIV_1;

  4.     TMR_BaseConfigStruct.countMode = TMR_COUNTER_MODE_UP;

  5.     TMR_BaseConfigStruct.division = 72;

  6.     TMR_BaseConfigStruct.period = 10;

  7.     TMR_BaseConfigStruct.repetitionCounter = 0;

  8.     TMR_ConfigTimeBase(TMR5, &TMR_BaseConfigStruct);



  9.     TMR_EnableInterrupt(TMR5, TMR_INT_UPDATE);

  10.     NVIC_EnableIRQRequest(TMR5_IRQn, 0, 0);



  11.     TMR_Enable(TMR5);
       b、中断配置
  1.     while (TMR_ReadIntFlag(TMR5, TMR_INT_UPDATE) == SET)

  2.     {

  3.         tick ++;

  4.         TMR_ClearIntFlag(TMR5, TMR_INT_UPDATE);

  5.     }


  6.                 if(tick == 3)

  7.                 {

  8.                                 TMR_Disable(TMR1);

  9.                                 TMR_DisablePWMOutputs(TMR1);


  10.                 }


  11.                 if(tick == 10)

  12.                 {        

  13.                                 TMR_Enable(TMR1);

  14.                     TMR_EnablePWMOutputs(TMR1);

  15.                                 tick = 0;

  16.                 }
       c、最终呈现波形效果
image-20240105171211-m2l7fnn.png



        最后,这样的方式确实能够简单的实现控制一段时间内的波形个数。但是这样的方式个人感觉还是有很多不妥当的地方,这样的方式仅能实现同一频率不同占空比的波形,如果波形的频率不一致的话,恐怕还是需要别的方式去实现。




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

本版积分规则

20

主题

21

帖子

2

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