打印
[技术问答]

HC32F460如何改pwm占空比

[复制链接]
2032|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
LUOKK|  楼主 | 2023-4-13 13:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
情况:我用的是timeA 通道一,由于我现在用了缓存所以我改变了通道二的占空比让他在三角波峰的时候传输,但是在占空比是满的情况下输出的不是高电平。

static void Timera_Config(void)
{
    /* 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);

    /* 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 = TimeraPclkDiv64;;  //分频
    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;
                stcTimerCompareInit.enCacheEn                                                                        = Enable;
                stcTimerCompareInit.enTriangularTroughTransEn = Enable;
                stcTimerCompareInit.enTriangularCrestTransEn  = Disable;
                stcTimerCompareInit.u16CompareCacheVal = stcTimerCompareInit.u16CompareVal;
               
    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);
                if(Value>=255)
                {
                        TIMERA_SpecifyOutputSta(M4_TMRA4,TimeraCh2,TimeraSpecifyOutputHigh);
                        //TIMERA_SetCompareValue(M4_TMRA4, TimeraCh2,u16TimerPeriod);
                }
                else if(Value<=0)
                {
                        TIMERA_SetCompareValue(M4_TMRA4, TimeraCh2,0);
                        //TIMERA_SpecifyOutputSta(M4_TMRA4,TimeraCh2,TimeraSpecifyOutputLow);
                }
                else
                {
                        Value = (u16TimerPeriod/255)*Value;
                        TIMERA_SetCompareValue(M4_TMRA4, TimeraCh2,Value);
                }
               
}



void Linear_variation()
{
                for(int i=0;i<256;i++)
        {
                       
                  Set_comValue(i);
                        Ddl_Delay1us(100);
        }

}

void Multiple_Changes()
{
                uint16_t i=0;
       
                for(i=0;i<300;i=i+10)
          {
                        Ddl_Delay1ms(100);
                        Set_comValue(i);
                        Ddl_Delay1ms(100);
                        Set_comValue(300);
          }
       
}
/**
*******************************************************************************
** \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;
                uint16_t getvalue = 0u;
    /* configure structure initialization */
    MEM_ZERO_STRUCT(stcPortInit);

    /* Configure system clock frequency */
    SystemClk_Init();
    /* Configure Timera */
    Timera_Config();
                Multiple_Changes(255);
    while (1)
    {
                        Multiple_Changes(255);
    }
}

使用特权

评论回复
沙发
tpgf| | 2024-2-2 15:46 | 只看该作者
更改定时器的相关配置就可以了啊

使用特权

评论回复
板凳
zljiu| | 2024-2-2 16:30 | 只看该作者
如果在这种情况下不能输出高电平的话 那么应该还是配置 有问题

使用特权

评论回复
地板
nawu| | 2024-2-2 21:27 | 只看该作者
修改完配置之后多长时间可以生效呢

使用特权

评论回复
5
aoyi| | 2024-2-2 22:00 | 只看该作者
其实改变占空比并不困难 关键是如何做到在运行中的无缝连接

使用特权

评论回复
6
gwsan| | 2024-2-2 22:37 | 只看该作者
一般来说在修改配置之后的下一个时钟周期就会生效的

使用特权

评论回复
7
tfqi| | 2024-2-2 23:10 | 只看该作者
我看以前的贴子也有反应这个问题的 楼主是不是可以试着换一个定时器试试看

使用特权

评论回复
8
xdvca| | 2024-7-31 22:42 | 只看该作者
enSpecifyOutput 被设置为 Invalid,这意味着指定输出功能未启用,可能会影响输出行为。

使用特权

评论回复
9
xdvca| | 2024-7-31 22:43 | 只看该作者
在 Multiple_Changes 函数中,你调用了 Set_comValue(i) 和 Set_comValue(300),这可能导致快速的占空比变化和不稳定的输出。

使用特权

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

本版积分规则

2

主题

4

帖子

0

粉丝