打印
[技术问答]

HC32F460如何动态改pwm占空比

[复制链接]
1394|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
LUOKK|  楼主 | 2023-4-11 18:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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);

}
/**
*******************************************************************************
** \brief  main function for Timera compare function
**
** \param [in]  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
可是这个操作 万一我一直频繁变换占空比会出现计数值还没到上限就被重装了,从而一直是低电平 ...

请使用定时器的缓存功能

使用特权

评论回复
5
LUOKK|  楼主 | 2023-4-12 15:13 | 只看该作者
wubangmi 发表于 2023-4-12 09:37
请使用定时器的缓存功能

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

使用特权

评论回复
6
tpgf| | 2023-4-14 13:53 | 只看该作者
动态的改变的话  是能做到无缝连接的吗

使用特权

评论回复
7
八层楼| | 2023-4-14 14:25 | 只看该作者
更改配置的话 新配置在什么时候才会生效呢

使用特权

评论回复
8
观海| | 2023-4-14 14:41 | 只看该作者
八层楼 发表于 2023-4-14 14:25
更改配置的话 新配置在什么时候才会生效呢

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

使用特权

评论回复
9
wubangmi| | 2023-4-14 18:09 | 只看该作者
LUOKK 发表于 2023-4-12 15:13
感谢提醒,但是再用缓存功能的时候遇到了问题就是,当占空比由别的数值变为0的时候会出现高电平的现象 ...

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

使用特权

评论回复
10
guanjiaer| | 2023-4-15 13:49 | 只看该作者
tpgf 发表于 2023-4-14 13:53
动态的改变的话  是能做到无缝连接的吗

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

使用特权

评论回复
11
heimaojingzhang| | 2023-4-15 14:34 | 只看该作者
wubangmi 发表于 2023-4-12 09:37
请使用定时器的缓存功能

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

使用特权

评论回复
12
keaibukelian| | 2023-4-15 15:02 | 只看该作者
heimaojingzhang 发表于 2023-4-15 14:34
请问什么是定时器的缓存功能啊 在什么时候有使用的必要呢

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

使用特权

评论回复
13
Henryko| | 2023-5-12 23:54 | 只看该作者
要在当前运行周期结束才能更新吧

使用特权

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

本版积分规则

2

主题

4

帖子

0

粉丝