LUOKK 发表于 2023-4-11 18:00

HC32F460如何动态改pwm占空比

static void Timera_Config(void)
{
          stc_timera_base_init_t stcTimeraInit;
    stc_timera_compare_init_t stcTimerCompareInit;
    stc_irq_regi_conf_t stcIrqRegiConf;
    stc_timera_hw_startup_config_t stcTimeraHwConfig;
    stc_port_init_t stcPortInit;
    /* configuration structure initialization */
    MEM_ZERO_STRUCT(stcTimeraInit);
    MEM_ZERO_STRUCT(stcIrqRegiConf);
    MEM_ZERO_STRUCT(stcTimerCompareInit);
    MEM_ZERO_STRUCT(stcTimeraHwConfig);
    MEM_ZERO_STRUCT(stcPortInit);

    /* Configuration peripheral clock */
    PWC_Fcg2PeriphClockCmd(PWC_FCG2_PERIPH_TIMA4, Enable);
    PWC_Fcg0PeriphClockCmd(PWC_FCG0_PERIPH_AOS, Enable);

    /* Configuration TIMERA compare pin */
                PORT_SetFunc(TIMERA_UNIT1_CH4_PORT, TIMERA_UNIT1_CH4_PIN, TIMERA_UNIT1_CH4_FUNC, Disable);
   
          /* Configuration timera unit 1 base structure */
    stcTimeraInit.enClkDiv = TimeraPclkDiv128;//分频
    stcTimeraInit.enCntMode = TimeraCountModeTriangularWave; //波形
    stcTimeraInit.enCntDir = TimeraCountDirUp;//计数方向
    stcTimeraInit.enSyncStartupEn = Disable;//关闭同步
    stcTimeraInit.u16PeriodVal = 330u;      //freq: 1000Hz //设置周期
                TIMERA_BaseInit(M4_TMRA4, &stcTimeraInit); //初始化tima4
               
    /* Configuration timera unit 1 compare structure */
    stcTimerCompareInit.u16CompareVal = 87u;//占空比
    stcTimerCompareInit.enStartCountOutput = TimeraCountStartOutputLow;
    stcTimerCompareInit.enStopCountOutput = TimeraCountStopOutputLow;
    stcTimerCompareInit.enCompareMatchOutput = TimeraCompareMatchOutputReverse;
    stcTimerCompareInit.enPeriodMatchOutput = TimeraPeriodMatchOutputKeep;
    stcTimerCompareInit.enSpecifyOutput = TimeraSpecifyOutputInvalid;
               
    TIMERA_CompareInit(M4_TMRA4, TIMERA_UNIT1_CH4, &stcTimerCompareInit);//比较使能
    TIMERA_CompareCmd(M4_TMRA4, TIMERA_UNIT1_CH4, Enable);//
                TIMERA_Cmd(M4_TMRA4,Enable);
}

void Set_comValue(uint16_t Value)
{
        float u16TimerPeriod;
                u16TimerPeriod = TIMERA_GetPeriodValue(M4_TMRA4);
                TIMERA_Cmd(M4_TMRA4,Disable);
                if(Value>=255)
                {
                        TIMERA_SpecifyOutputSta(M4_TMRA4,TIMERA_UNIT1_CH4,TimeraSpecifyOutputHigh);
                        TIMERA_CompareCmd(M4_TMRA4, TIMERA_UNIT1_CH4, Enable);//
                }
                else if(Value<=0)
                {
                        TIMERA_SpecifyOutputSta(M4_TMRA4,TIMERA_UNIT1_CH4,TimeraSpecifyOutputLow);
                        TIMERA_CompareCmd(M4_TMRA4, TIMERA_UNIT1_CH4, Enable);//
                }
                else
                {
                        Value = (u16TimerPeriod/255)*Value;
                        TIMERA_SetCompareValue(M4_TMRA4, TIMERA_UNIT1_CH4,Value);
                        TIMERA_CompareCmd(M4_TMRA4, TIMERA_UNIT1_CH4, Enable);//
                }
                TIMERA_Cmd(M4_TMRA4,Enable);
               
}



void Linear_variation()
{
                for(int i=0;i<255;i++)
        {
                        Ddl_Delay1ms(500ul);
                  Set_comValue(i);
                        Ddl_Delay1ms(500ul);
        }
        TIMERA_Cmd(M4_TMRA4,Enable);

}
/**
*******************************************************************************
** \briefmain function for Timera compare function
**
** \param None
**
** \retval int32_t Return value, if needed
**
******************************************************************************/
int32_t main(void)
{
    uint16_t u16TimerPeriod = 0u, u16DutyCycle = 0u;
    stc_port_init_t stcPortInit;

    /* configure structure initialization */
    MEM_ZERO_STRUCT(stcPortInit);

    /* Configure system clock frequency */
    SystemClk_Init();
    /* Configure Timera */
    Timera_Config();
    u16DutyCycle = TIMERA_GetCompareValue(M4_TMRA4, TIMERA_UNIT1_CH4);
    u16TimerPeriod = TIMERA_GetPeriodValue(M4_TMRA4);
    while (1)
    {
                        Linear_variation();
    }
}

chenjun89 发表于 2023-4-11 20:16

好像是重装计数器值

LUOKK 发表于 2023-4-12 09:34

chenjun89 发表于 2023-4-11 20:16
好像是重装计数器值

可是这个操作 万一我一直频繁变换占空比会出现计数值还没到上限就被重装了,从而一直是低电平

wubangmi 发表于 2023-4-12 09:37

LUOKK 发表于 2023-4-12 09:34
可是这个操作 万一我一直频繁变换占空比会出现计数值还没到上限就被重装了,从而一直是低电平 ...

请使用定时器的缓存功能

LUOKK 发表于 2023-4-12 15:13

wubangmi 发表于 2023-4-12 09:37
请使用定时器的缓存功能

感谢提醒,但是再用缓存功能的时候遇到了问题就是,当占空比由别的数值变为0的时候会出现高电平的现象

tpgf 发表于 2023-4-14 13:53

动态的改变的话是能做到无缝连接的吗

八层楼 发表于 2023-4-14 14:25

更改配置的话 新配置在什么时候才会生效呢

观海 发表于 2023-4-14 14:41

八层楼 发表于 2023-4-14 14:25
更改配置的话 新配置在什么时候才会生效呢

感觉应该是当前的运行周期结束后生效

wubangmi 发表于 2023-4-14 18:09

LUOKK 发表于 2023-4-12 15:13
感谢提醒,但是再用缓存功能的时候遇到了问题就是,当占空比由别的数值变为0的时候会出现高电平的现象 ...

TimerA有个端口控制寄存器,占空比为0和100%的时候,需要用这个寄存器的一位配置让输出使能无效,然后寄存器的另外两位配置端口强制切换成输出低和输出高。除了0和100%之外的占空比又需要重新配置成输出使能有效。
如果没明白我说的意思,请直接找你对应的代理商朋友

guanjiaer 发表于 2023-4-15 13:49

tpgf 发表于 2023-4-14 13:53
动态的改变的话是能做到无缝连接的吗

应该是的 因为改变的时候并不需要停止使用pwm啊

heimaojingzhang 发表于 2023-4-15 14:34

wubangmi 发表于 2023-4-12 09:37
请使用定时器的缓存功能

请问什么是定时器的缓存功能啊 在什么时候有使用的必要呢

keaibukelian 发表于 2023-4-15 15:02

heimaojingzhang 发表于 2023-4-15 14:34
请问什么是定时器的缓存功能啊 在什么时候有使用的必要呢

这个说的是不是预装寄存器及影子寄存器呀

Henryko 发表于 2023-5-12 23:54

要在当前运行周期结束才能更新吧
页: [1]
查看完整版本: HC32F460如何动态改pwm占空比