打印
[APM32E1]

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

[复制链接]
92|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个通道的占空比,那么就能够实现。


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



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

    TMR_BaseConfig_T TMR_TimeBaseStruct;

    TMR_OCConfig_T OCcongigStruct;



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



    GPIO_ConfigStruct.pin = GPIO_PIN_8;

    GPIO_ConfigStruct.mode = GPIO_MODE_AF_PP;

    GPIO_ConfigStruct.speed = GPIO_SPEED_50MHz;

    GPIO_Config(GPIOA, &GPIO_ConfigStruct);



                GPIO_ConfigStruct.pin = GPIO_PIN_9;

    GPIO_ConfigStruct.mode = GPIO_MODE_AF_PP;

    GPIO_ConfigStruct.speed = GPIO_SPEED_50MHz;

    GPIO_Config(GPIOA, &GPIO_ConfigStruct);



    TMR_TimeBaseStruct.clockDivision = TMR_CLOCK_DIV_1;

    TMR_TimeBaseStruct.countMode = TMR_COUNTER_MODE_UP;

    TMR_TimeBaseStruct.division = 71;

    TMR_TimeBaseStruct.period = 10;

    TMR_ConfigTimeBase(TMR1, &TMR_TimeBaseStruct);



    OCcongigStruct.idleState = TMR_OC_IDLE_STATE_RESET;

    OCcongigStruct.mode = TMR_OC_MODE_PWM1;

    OCcongigStruct.nIdleState = TMR_OC_NIDLE_STATE_RESET;

    OCcongigStruct.nPolarity = TMR_OC_NPOLARITY_HIGH;

    OCcongigStruct.outputNState = TMR_OC_NSTATE_ENABLE;

    OCcongigStruct.outputState = TMR_OC_STATE_ENABLE;

    OCcongigStruct.polarity = TMR_OC_POLARITY_HIGH;

    OCcongigStruct.pulse = 5;

    TMR_ConfigOC1(TMR1, &OCcongigStruct);


                OCcongigStruct.idleState = TMR_OC_IDLE_STATE_RESET;

    OCcongigStruct.mode = TMR_OC_MODE_PWM1;

    OCcongigStruct.nIdleState = TMR_OC_NIDLE_STATE_RESET;

    OCcongigStruct.nPolarity = TMR_OC_NPOLARITY_HIGH;

    OCcongigStruct.outputNState = TMR_OC_NSTATE_ENABLE;

    OCcongigStruct.outputState = TMR_OC_STATE_ENABLE;

    OCcongigStruct.polarity = TMR_OC_POLARITY_HIGH;

    OCcongigStruct.pulse = 2;

    TMR_ConfigOC2(TMR1, &OCcongigStruct);



    TMR_ConfigOC1Preload(TMR1, TMR_OC_PRELOAD_ENABLE);

    TMR_EnableAutoReload(TMR1);

    TMR_Enable(TMR1);

    TMR_EnablePWMOutputs(TMR1);






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

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



    RCM_EnableAPB1PeriphClock(RCM_APB1_PERIPH_TMR5);



    TMR_BaseConfigStruct.clockDivision = TMR_CLOCK_DIV_1;

    TMR_BaseConfigStruct.countMode = TMR_COUNTER_MODE_UP;

    TMR_BaseConfigStruct.division = 72;

    TMR_BaseConfigStruct.period = 10;

    TMR_BaseConfigStruct.repetitionCounter = 0;

    TMR_ConfigTimeBase(TMR5, &TMR_BaseConfigStruct);



    TMR_EnableInterrupt(TMR5, TMR_INT_UPDATE);

    NVIC_EnableIRQRequest(TMR5_IRQn, 0, 0);



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

    {

        tick ++;

        TMR_ClearIntFlag(TMR5, TMR_INT_UPDATE);

    }


                if(tick == 3)

                {

                                TMR_Disable(TMR1);

                                TMR_DisablePWMOutputs(TMR1);


                }


                if(tick == 10)

                {        

                                TMR_Enable(TMR1);

                    TMR_EnablePWMOutputs(TMR1);

                                tick = 0;

                }
       c、最终呈现波形效果




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




使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

19

主题

20

帖子

2

粉丝