hzqy110 发表于 2020-10-31 23:30

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);
}







Lbsonggz 发表于 2020-11-1 10:51

PWM=0时,直接输出低电平多好

Hardsofter 发表于 2020-11-17 15:53

据说占空比设置为0的时候还有一个0.4%的占空比在。

数据采集存储 发表于 2020-11-17 18:22

程序很复杂,我没有看懂,哎。

martinhu 发表于 2020-11-20 19:23

建议不要用timer6来输出,用timer3来输出PWM,030驱动库也有相关例程。
如果用timer6来输出两路独立的PWM,那么请参考如下:

Puremr 发表于 2020-11-26 09:27

为什么不能用timer6来输出单路的呢?理论上只用一路也是可以的。

hzqy110 发表于 2020-12-16 14:57

HC32F030的高级定时器确实没办法和普通定时器一样输出控制,各种配置方式配置都试过了,都没办法解决,最后只能0% 占空比只能用关闭定时器的方式实现。

hzqy110 发表于 2020-12-16 14:59

martinhu 发表于 2020-11-20 19:23
建议不要用timer6来输出,用timer3来输出PWM,030驱动库也有相关例程。
如果用timer6来输出两路独立的PWM, ...

0到3的定时器都可以正常,以前用ST的单片机时候没遇到过这种情况,也用高级定时器做PWM输出使用,都是正常的

hzqy110 发表于 2020-12-16 15:00

Lbsonggz 发表于 2020-11-1 10:51
PWM=0时,直接输出低电平多好

关闭定时器也可以,如果用IO输出0的话还要配置IO口,麻烦

martinhu 发表于 2020-12-16 15:42

hzqy110 发表于 2020-12-16 14:59
0到3的定时器都可以正常,以前用ST的单片机时候没遇到过这种情况,也用高级定时器做PWM输出使用,都是正 ...

HC32F030的高级定时器和ST的不一样

wangxx158 发表于 2020-12-20 17:05

我也遇到过类似的情况,ST的新唐的都可以把对应的PWM数据设置为了0时输出低电平,后面我解决了,你把stcAdtBaseCntCfg.enCntDir = AdtCntUp;屏蔽掉就可以了.

AKOO 发表于 2020-12-20 17:25

wangxx158 发表于 2020-12-20 17:05
我也遇到过类似的情况,ST的新唐的都可以把对应的PWM数据设置为了0时输出低电平,后面我解决了,你把stcAdtBas ...

请教一下,这一句是设置计数器计数方向用的,似乎跟这个出现波形没有关联,屏蔽了这一句真的没关系吗?

ColoredCrystal 发表于 2021-4-2 11:28

        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
...

sgrtf661 发表于 2021-7-14 16:07

华大代理 可以做技术支持 QQ:409946461

asmine 发表于 2021-7-14 16:40

应该不是杂波,可能还是定时器的事

自己造声卡 发表于 2021-7-14 17:08

先测试IO口的高低电平,是否有问题、
页: [1]
查看完整版本: HC32F030的TIM6输出PWM时占空比为0时候有杂波