HC32F030的TIM6输出PWM时占空比为0时候有杂波
本帖最后由 hzqy110 于 2020-10-31 23:35 编辑STM32F030单片机PB12和PB13设置为PWM输出,在配置的占空比不为0时候,PWM输出波形都是正常的。但是在配置为PWM0时候,正常结果是IO输出低电平,但是实际示波器测试IO脚为低电平但是有很多杂波输出。一下是程序,有高手麻烦帮忙看一下
#define Frequency_Max 1000
#define Frequency_Pulse 0
#define LED5_Num GpioPin12
#define LED6_Num GpioPin13
#define LED5_GPIO GpioPortB
#define LED6_GPIO GpioPortB
#define LED5(a) Adt_SetCompareValue(AdtTIM6, AdtCompareA, a)
#define LED6(a) Adt_SetCompareValue(AdtTIM6, AdtCompareB, a)
void TIM6_GPIO_Config(void)
{
stc_gpio_config_t stcTIM6Port;
Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio, TRUE); //¶Ë¿ÚÍâÉèʱÖÓʹÄÜ
stcTIM6Port.enDir= GpioDirOut;
Gpio_Init(LED5_GPIO, LED5_Num, &stcTIM6Port);
Gpio_SetAfMode(LED5_GPIO,LED5_Num,LED5_GpioAf);
Gpio_Init(LED6_GPIO, LED6_Num, &stcTIM6Port);
Gpio_SetAfMode(LED6_GPIO,LED6_Num,LED6_GpioAf); //
while (Ok != Sysctrl_SetPeripheralGate(SysctrlPeripheralAdvTim, TRUE));//ADTÍâÉèʱÖÓʹÄÜ
}
void TIM6_Mode_Config(void)
{
stc_adt_basecnt_cfg_t stcAdtBaseCntCfg;
stc_adt_CHxX_port_cfg_t stcAdtTIM6ACfg;
stcAdtBaseCntCfg.enCntMode = AdtSawtoothMode; //Èý½Ç²¨A
stcAdtBaseCntCfg.enCntDir = AdtCntUp;
stcAdtBaseCntCfg.enCntClkDiv = AdtClkPClk0;
Adt_Init(AdtTIM6, &stcAdtBaseCntCfg); //ADTÔØ²¨£¬¼ÆÊýģʽ£¬Ê±ÖÓÅäÖÃ
Adt_SetPeriod(AdtTIM6, Frequency_Max); //ÖÜÆÚ
Adt_SetCompareValue(AdtTIM6, AdtCompareA, Frequency_Pulse); //ͨÓñȽϻù×¼Öµ¼Ä´æÆ÷AÉèÖÃ
Adt_SetCompareValue(AdtTIM6, AdtCompareB, Frequency_Pulse); //ͨÓñȽϻù×¼Öµ¼Ä´æÆ÷AÉèÖÃ
stcAdtTIM6ACfg.enCap = AdtCHxCompareOutput;
stcAdtTIM6ACfg.bOutEn = TRUE;
stcAdtTIM6ACfg.enPerc = AdtCHxPeriodHigh;
stcAdtTIM6ACfg.enCmpc = AdtCHxCompareLow;
stcAdtTIM6ACfg.enStaStp = AdtCHxStateSelSS;
stcAdtTIM6ACfg.enStaOut = AdtCHxPortOutLow; //¿ªÊ¼¶Ë¿Ú״̬ΪµÍµçƽ
stcAdtTIM6ACfg.enStpOut = AdtCHxPortOutLow; //½áÊø¶Ë¿Ú״̬ΪµÍµçƽ
Adt_CHxXPortConfig(AdtTIM6, AdtCHxA, &stcAdtTIM6ACfg); //¶Ë¿ÚCHAÅäÖÃ
Adt_CHxXPortConfig(AdtTIM6, AdtCHxB, &stcAdtTIM6ACfg); //¶Ë¿ÚCHAÅäÖÃ
Adt_StartCount(AdtTIM6);
}
PWM=0时,直接输出低电平多好 据说占空比设置为0的时候还有一个0.4%的占空比在。 程序很复杂,我没有看懂,哎。
建议不要用timer6来输出,用timer3来输出PWM,030驱动库也有相关例程。
如果用timer6来输出两路独立的PWM,那么请参考如下:
为什么不能用timer6来输出单路的呢?理论上只用一路也是可以的。 HC32F030的高级定时器确实没办法和普通定时器一样输出控制,各种配置方式配置都试过了,都没办法解决,最后只能0% 占空比只能用关闭定时器的方式实现。 martinhu 发表于 2020-11-20 19:23
建议不要用timer6来输出,用timer3来输出PWM,030驱动库也有相关例程。
如果用timer6来输出两路独立的PWM, ...
0到3的定时器都可以正常,以前用ST的单片机时候没遇到过这种情况,也用高级定时器做PWM输出使用,都是正常的 Lbsonggz 发表于 2020-11-1 10:51
PWM=0时,直接输出低电平多好
关闭定时器也可以,如果用IO输出0的话还要配置IO口,麻烦
hzqy110 发表于 2020-12-16 14:59
0到3的定时器都可以正常,以前用ST的单片机时候没遇到过这种情况,也用高级定时器做PWM输出使用,都是正 ...
HC32F030的高级定时器和ST的不一样 我也遇到过类似的情况,ST的新唐的都可以把对应的PWM数据设置为了0时输出低电平,后面我解决了,你把stcAdtBaseCntCfg.enCntDir = AdtCntUp;屏蔽掉就可以了. wangxx158 发表于 2020-12-20 17:05
我也遇到过类似的情况,ST的新唐的都可以把对应的PWM数据设置为了0时输出低电平,后面我解决了,你把stcAdtBas ...
请教一下,这一句是设置计数器计数方向用的,似乎跟这个出现波形没有关联,屏蔽了这一句真的没关系吗? M0P_ADTIM5->GCONR_f.MODE = 0; // Sawtooth Mode
M0P_ADTIM5->GCONR_f.DIR = 1; // 1 count up
M0P_ADTIM5->GCONR_f.CKDIV = 0; // PCLK/1
M0P_ADTIM5->PERAR = (BIT_HI+BIT_LO); // freq, 1.25us(800kpbs)@24MHz=30ticks
M0P_ADTIM5->GCMAR = 0; // pwm duty
M0P_ADTIM5->PCONR_f.CAPCA = 0; // 0 compare output, 1 compare input
M0P_ADTIM5->PCONR_f.STACA = 1; // 0 start low
M0P_ADTIM5->PCONR_f.STPCA = 1; // 0 stop low
M0P_ADTIM5->PCONR_f.STASTPSA = 0; // 0 start stop control by STACA & STPCA, 1 keep
M0P_ADTIM5->PCONR_f.CMPCA = 0; // counter match: 0 low, 1 high, 2 keep, 3 invert
M0P_ADTIM5->PCONR_f.PERCA = 0; // period start: 0 low, 1 high, 2 keep, 3 invert
M0P_ADTIM5->PCONR_f.OUTENA = 1; // output enable
M0P_ADTIM5->PCONR_f.DISSELA = 0;
M0P_ADTIM5->PCONR_f.DISVALA = 0;
M0P_ADTIM5->FCONR_f.NOFIENGA = 0;
M0P_ADTIM5->FCONR_f.NOFICKGA = 0;
控制这个就行:
if(duty == 0)
M0P_ADTIM5->PCONR_f.PERCA = 0; // period start: 0 low, 1 high, 2 keep, 3 invert
else
... 华大代理 可以做技术支持 QQ:409946461 应该不是杂波,可能还是定时器的事 先测试IO口的高低电平,是否有问题、
页:
[1]