hc32f460系列输出可调占空比的PWM波
请问最好用哪个定时器?还有就是占空比和频率怎么计算? 虽然 用户手册 屎一样, 但是 你还是得看! 需要仔细看看手册的,我认为还是要看的细一些。单片小菜 发表于 2021-7-14 15:16
需要仔细看看手册的,我认为还是要看的细一些。
用的TimerA,但是自己设置的周期值,和比较基准值,跟输出的波形结果不一致 华大代理 可以做技术支持 QQ:409946461
参照这个章节 6楼讲的太细致了,不错。
我就是按照手册进行配置的{:sweat:} TimerA最简单,其次是timer6和timer4都可以 你配置完,有什么问题呢?占空比不对?频率不对? carpsnow 发表于 2021-7-15 13:33
你配置完,有什么问题呢?占空比不对?频率不对?
示波器显示有杂波,然后占空比不对{:cry:} 这位兄弟看起来是本论坛活跃用户,有疑问加微信详聊。华大马生18688968198@abcd文刀三皮 占空比 = u16Compare / u16Period martinhu 发表于 2021-7-15 09:29
TimerA最简单,其次是timer6和timer4都可以
你好,我使用TimerA产生100hz的PWM波,逻辑分析仪抓取波形正常。
但是,出现一个问题:
使用三角波计数模式,设置输出40%的占空比,启动后有时输出是40%,有时输出是60%;出现了占空比互补现象,是什么原因,偶发出现。
参考例子:timera_sawtooth_wave_base_timer chnchmhgw 发表于 2021-7-15 16:01
你好,我使用TimerA产生100hz的PWM波,逻辑分析仪抓取波形正常。
但是,出现一个问题:
使用三角波计数模 ...
TimerA的初始化配置代码,在main.c中初始化,具体如下:
static void Timera_Config(void)
{
stc_timera_base_init_t stcTimeraInit;
stc_timera_compare_init_t stcTimerCompareInit;
stc_irq_regi_conf_t stcIrqRegiConf;
stc_port_init_t stcPortInit;
/* configuration structure initialization */
MEM_ZERO_STRUCT(stcTimeraInit);
MEM_ZERO_STRUCT(stcIrqRegiConf);
MEM_ZERO_STRUCT(stcTimerCompareInit);
MEM_ZERO_STRUCT(stcPortInit);
/* Configuration peripheral clock */
PWC_Fcg2PeriphClockCmd(TIMERA_UNIT4_CLOCK, Enable);
PWC_Fcg0PeriphClockCmd(PWC_FCG0_PERIPH_AOS, Enable);
/* Configuration TIMERA compare pin */
PORT_SetFunc(TIMERA_UNIT4_CH2_PORT, TIMERA_UNIT4_CH2_PIN, TIMERA_UNIT4_CH2_FUNC, Disable);
/* Configuration timera unit 4 base structure */
stcTimeraInit.enClkDiv = TimeraPclkDiv128;//84M/128 = 656.25Khz
stcTimeraInit.enCntMode = TimeraCountModeTriangularWave; //TriangularWave
stcTimeraInit.enCntDir = TimeraCountDirUp;
stcTimeraInit.enSyncStartupEn = Disable;
stcTimeraInit.u16PeriodVal = PERIOD_VAL; //freq: 100Hz; cd0/hex = 3280/dec
TIMERA_BaseInit(TIMERA_UNIT4, &stcTimeraInit);
/* Configuration timera unit 4 compare structure */
stcTimerCompareInit.u16CompareVal = stcTimeraInit.u16PeriodVal * 4u / 5u; //duty cycle: (1-80%)=20%
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;
/* Configure Channel 2 */
TIMERA_CompareInit(TIMERA_UNIT4, TIMERA_UNIT4_CH2, &stcTimerCompareInit);
TIMERA_CompareCmd(TIMERA_UNIT4, TIMERA_UNIT4_CH2, Enable);
/* Enable period count interrupt */
TIMERA_IrqCmd(TIMERA_UNIT4, TimeraIrqOverflow, Enable);
/* Interrupt of timera unit 4 */
stcIrqRegiConf.enIntSrc = TIMERA_UNIT4_OVERFLOW_INT;
stcIrqRegiConf.enIRQn = Int006_IRQn;
stcIrqRegiConf.pfnCallback = &TimeraUnit4_IrqCallback;
enIrqRegistration(&stcIrqRegiConf);
NVIC_ClearPendingIRQ(stcIrqRegiConf.enIRQn);
NVIC_SetPriority(stcIrqRegiConf.enIRQn, DDL_IRQ_PRIORITY_15);
NVIC_EnableIRQ(stcIrqRegiConf.enIRQn);
/* Configure timera unit 4 disable */
TIMERA_Cmd(TIMERA_UNIT4, Disable);
}
通过PUMP_ON来启动pwm波,PUMP_ON在中断函数中调用:
/* TIMERA PWM parameter definition */
#define PERIOD_VAL 0xCD0u
#define DUTY_CYLCE (0.4) //duty cycle: 0~1, except 0 and 1; duty_cycle = u16Compare/u16Period = COMPARE_VAL/PERIOD_VAL
#define COMPARE_VAL (PERIOD_VAL * (1-DUTY_CYLCE))
#define PUMP_ON() {TIMERA_Cmd(TIMERA_UNIT4, Enable);TIMERA_SetCompareValue(TIMERA_UNIT4, TIMERA_UNIT4_CH2, COMPARE_VAL);}
#define PUMP_OFF() TIMERA_Cmd(TIMERA_UNIT4, Disable) 有没有人需要HC32L136K8TA封装QFP64 7*7 chnchmhgw 发表于 2021-7-15 16:31
TimerA的初始化配置代码,在main.c中初始化,具体如下:
static void Timera_Config(void)
{
把TimerA的分频取消试试,
或者建议你更改如下两行,如果只是单路的PWM,用锯齿波模式,比较匹配和周期匹配,一个输出高电平,另一个输出低电平,这样确定的电平设置,应该不会出现相反的现象。
讨论的好认真,加油楼主
页:
[1]