打印
[技术问答]

hc32f460系列输出可调占空比的PWM

[复制链接]
2025|20
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
参考例程timera_triangular_wave_compare_output修改的输出波形不是方波。哪位大佬能帮我看看哪里有问题。

#include "hc32_ddl.h"

/* TIMERA unit and clock definition */
#define TIMERA_UNIT1                    (M4_TMRA1)
#define TIMERA_UNIT1_CLOCK              (PWC_FCG2_PERIPH_TIMA1)
#define TIMERA_UNIT1_OVERFLOW_INT       (INT_TMRA1_OVF)

/* TIMERA channel 1 Port/Pin definition */
#define TIMERA_UNIT1_CH1                (TimeraCh1)
#define TIMERA_UNIT1_CH1_PORT           (PortA)
#define TIMERA_UNIT1_CH1_PIN            (Pin14)
#define TIMERA_UNIT1_CH1_FUNC           (Func_Tima0)

/* TIMERA channel 3 Port/Pin definition */
#define TIMERA_UNIT1_CH3                (TimeraCh3)
#define TIMERA_UNIT1_CH3_PORT           (PortA)
#define TIMERA_UNIT1_CH3_PIN            (Pin05)
#define TIMERA_UNIT1_CH3_FUNC           (Func_Tima0)


static uint8_t u8TmraUnit1Cnt = 0u;
uint16_t u16TimerPeriod = 0u, u16DutyCycle = 0u;

/**
*******************************************************************************
** \brief Timera unit 1 callback function
**
** \param [in]  None
**
** \retval None
**
******************************************************************************/
static void TimeraUnit1_IrqCallback(void)
{
    u8TmraUnit1Cnt++;
    if (u8TmraUnit1Cnt >= 100u)      //1s
    {
        u8TmraUnit1Cnt = 0u;
        PORT_Toggle(PortH, Pin02);//LED
    }
    TIMERA_ClearFlag(TIMERA_UNIT1, TimeraFlagOverflow);
}

/**
*******************************************************************************
** \brief Configure Timera peripheral function
**
** \param [in] None
**
** \retval None
**
******************************************************************************/
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;

    /* configuration structure initialization */
    MEM_ZERO_STRUCT(stcTimeraInit);
    MEM_ZERO_STRUCT(stcIrqRegiConf);
    MEM_ZERO_STRUCT(stcTimerCompareInit);
    MEM_ZERO_STRUCT(stcTimeraHwConfig);

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

    /* Configuration TIMERA compare pin */
    PORT_SetFunc(TIMERA_UNIT1_CH1_PORT, TIMERA_UNIT1_CH1_PIN, TIMERA_UNIT1_CH1_FUNC, Disable);
    PORT_SetFunc(TIMERA_UNIT1_CH3_PORT, TIMERA_UNIT1_CH3_PIN, TIMERA_UNIT1_CH3_FUNC, Disable);

    /* Configuration timera unit 1 base structure */
    stcTimeraInit.enClkDiv = TimeraPclkDiv128;     //100MHz 128分频
    //stcTimeraInit.enCntMode = TimeraCountModeSawtoothWave;
        stcTimeraInit.enCntMode = TimeraCountModeTriangularWave;
    stcTimeraInit.enCntDir = TimeraCountDirUp;
    stcTimeraInit.enSyncStartupEn = Disable;
    stcTimeraInit.u16PeriodVal = 1000u;
    TIMERA_BaseInit(TIMERA_UNIT1, &stcTimeraInit);

    /* Configuration timera unit 1 compare structure */
    stcTimerCompareInit.u16CompareVal = stcTimeraInit.u16PeriodVal * 4u / 5u;
    stcTimerCompareInit.enStartCountOutput = TimeraCountStartOutputLow;
    stcTimerCompareInit.enStopCountOutput = TimeraCountStopOutputLow;
    stcTimerCompareInit.enCompareMatchOutput = TimeraCompareMatchOutputHigh;
    stcTimerCompareInit.enPeriodMatchOutput = TimeraPeriodMatchOutputLow;
    stcTimerCompareInit.enSpecifyOutput = TimeraSpecifyOutputInvalid;
    stcTimerCompareInit.enCacheEn = Enable;
    stcTimerCompareInit.enTriangularTroughTransEn = Enable;
    stcTimerCompareInit.enTriangularCrestTransEn = Disable;
    stcTimerCompareInit.u16CompareCacheVal = stcTimeraInit.u16PeriodVal * 4u / 5u;
    /* Configure Channel 1 */
    TIMERA_CompareInit(TIMERA_UNIT1, TIMERA_UNIT1_CH1, &stcTimerCompareInit);
    TIMERA_CompareCmd(TIMERA_UNIT1, TIMERA_UNIT1_CH1, Enable);

    /* Configure channel 3 */
    stcTimerCompareInit.enStartCountOutput = TimeraCountStartOutputHigh;
    stcTimerCompareInit.enStopCountOutput = TimeraCountStopOutputHigh;
        stcTimerCompareInit.enCompareMatchOutput = TimeraCompareMatchOutputLow;
    stcTimerCompareInit.enPeriodMatchOutput = TimeraPeriodMatchOutputHigh;
    TIMERA_CompareInit(TIMERA_UNIT1, TIMERA_UNIT1_CH3, &stcTimerCompareInit);
    TIMERA_CompareCmd(TIMERA_UNIT1, TIMERA_UNIT1_CH3, Enable);

    /* Enable period count interrupt */
    TIMERA_IrqCmd(TIMERA_UNIT1, TimeraIrqOverflow, Enable);
    /* Interrupt of timera unit 1 */
    stcIrqRegiConf.enIntSrc = TIMERA_UNIT1_OVERFLOW_INT;
    stcIrqRegiConf.enIRQn = Int006_IRQn;
    stcIrqRegiConf.pfnCallback = &TimeraUnit1_IrqCallback;
    enIrqRegistration(&stcIrqRegiConf);
    NVIC_ClearPendingIRQ(stcIrqRegiConf.enIRQn);
    NVIC_SetPriority(stcIrqRegiConf.enIRQn, DDL_IRQ_PRIORITY_DEFAULT);
    NVIC_EnableIRQ(stcIrqRegiConf.enIRQn);

        TIMERA_Cmd(TIMERA_UNIT1,Enable);
        TIMERA_SetCompareValue(TIMERA_UNIT1, TIMERA_UNIT1_CH1, stcTimeraInit.u16PeriodVal * 4u / 5u);
        TIMERA_SetCompareValue(TIMERA_UNIT1, TIMERA_UNIT1_CH3, stcTimeraInit.u16PeriodVal * 4u / 5u);
}

/**
*******************************************************************************
** \brief  main function for Timera compare function
**
** \param [in]  None
**
** \retval int32_t Return value, if needed
**
******************************************************************************/
int32_t main(void)
{
   
        stc_port_init_t stcPortInit;
    MEM_ZERO_STRUCT(stcPortInit);
    stcPortInit.enPinMode = Pin_Mode_Out;
        stcPortInit.enExInt = Enable;
        stcPortInit.enPullUp = Enable;
       
        PORT_Init(PortH, Pin02,&stcPortInit);//Led

    /* BSP initialization */
    BSP_CLK_Init();

    /* Configure Timera */
    Timera_Config();


    while (1)
    {
                ;
    }
}

/*******************************************************************************
* EOF (not truncated)
******************************************************************************/

使用特权

评论回复
沙发
redone| | 2022-10-1 09:37 | 只看该作者
效果如何呢

使用特权

评论回复
板凳
yeates333| | 2022-10-2 22:53 | 只看该作者
PWM中占空比和输出电压的关系?  

使用特权

评论回复
地板
caigang13| | 2022-10-3 11:53 | 只看该作者
PWM用好了,很好用。

使用特权

评论回复
5
kkzz| | 2022-10-5 16:41 | 只看该作者
怎么才能输出占空比可调的PWM  

使用特权

评论回复
6
wilhelmina2| | 2022-10-5 17:01 | 只看该作者

pwm的频率和占空比之间的关系?  

使用特权

评论回复
7
weifeng90| | 2022-10-5 17:10 | 只看该作者
楼主解决没?

使用特权

评论回复
8
mickit| | 2022-10-5 17:33 | 只看该作者
如何输出占空比可变的PWM信号  

使用特权

评论回复
9
mattlincoln| | 2022-10-5 18:11 | 只看该作者
是不是相当于可调电压输出?               

使用特权

评论回复
10
modesty3jonah| | 2022-10-5 18:58 | 只看该作者
如何用hc32f460单片机输出一个占空比可调的方波

使用特权

评论回复
11
sheflynn| | 2022-10-5 19:49 | 只看该作者
如何通过调节PWM的占空比来调节电压

使用特权

评论回复
12
tpgf| | 2022-10-9 09:55 | 只看该作者
实际波形的占空比大概是多少啊

使用特权

评论回复
13
gwsan| | 2022-10-9 10:10 | 只看该作者
微微调整一下高低电平的比例

使用特权

评论回复
14
wiba| | 2022-10-9 10:21 | 只看该作者
就是在一个周期内调整高低电平的比例就行了

使用特权

评论回复
15
drer| | 2022-10-9 11:03 | 只看该作者
wilhelmina2 发表于 2022-10-5 17:01
pwm的频率和占空比之间的关系?

频率和占空比没有任何关系  占空比就是一个周期内高低电平所占比例

使用特权

评论回复
16
tfqi| | 2022-10-9 11:14 | 只看该作者
可以通过寄存器直接配置输出的占空比吗

使用特权

评论回复
17
kxsi| | 2022-10-9 11:32 | 只看该作者
yeates333 发表于 2022-10-2 22:53
PWM中占空比和输出电压的关系?

输出电压应该是pwm波 其有效值和占空比有关系但是幅值没有任何关系

使用特权

评论回复
18
jstgotodo| | 2022-10-9 20:03 | 只看该作者
如何通过调节电位器,用来控制pwm占空比

使用特权

评论回复
19
youtome| | 2022-10-9 20:55 | 只看该作者
1,输出PWM频率 2,输出电压 3,可变占空比比例大小  

使用特权

评论回复
20
updownq| | 2022-10-9 21:46 | 只看该作者
利用AD采样得到的值控制输出占空比可调的PWM?   

使用特权

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

本版积分规则

2

主题

3

帖子

1

粉丝