打印
[技术问答]

HC32F030的TIM6输出PWM时占空比为0时候有杂波

[复制链接]
3813|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hzqy110|  楼主 | 2020-10-31 23:30 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
PWM, HC, TI, AD, ADT
本帖最后由 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);
}






微信截图_20201031230033.png (654.38 KB )

微信截图_20201031230033.png

使用特权

评论回复
沙发
Lbsonggz| | 2020-11-1 10:51 | 只看该作者
PWM=0时,直接输出低电平多好

使用特权

评论回复
板凳
Hardsofter| | 2020-11-17 15:53 | 只看该作者
据说占空比设置为0的时候还有一个0.4%的占空比在。

使用特权

评论回复
地板
数据采集存储| | 2020-11-17 18:22 | 只看该作者
程序很复杂,我没有看懂,哎。

使用特权

评论回复
5
martinhu| | 2020-11-20 19:23 | 只看该作者
建议不要用timer6来输出,用timer3来输出PWM,030驱动库也有相关例程。
如果用timer6来输出两路独立的PWM,那么请参考如下:

使用特权

评论回复
6
Puremr| | 2020-11-26 09:27 | 只看该作者
为什么不能用timer6来输出单路的呢?理论上只用一路也是可以的。

使用特权

评论回复
7
hzqy110|  楼主 | 2020-12-16 14:57 | 只看该作者
HC32F030的高级定时器确实没办法和普通定时器一样输出控制,各种配置方式配置都试过了,都没办法解决,最后只能0% 占空比只能用关闭定时器的方式实现。

使用特权

评论回复
8
hzqy110|  楼主 | 2020-12-16 14:59 | 只看该作者
martinhu 发表于 2020-11-20 19:23
建议不要用timer6来输出,用timer3来输出PWM,030驱动库也有相关例程。
如果用timer6来输出两路独立的PWM, ...

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

使用特权

评论回复
9
hzqy110|  楼主 | 2020-12-16 15:00 | 只看该作者
Lbsonggz 发表于 2020-11-1 10:51
PWM=0时,直接输出低电平多好

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

使用特权

评论回复
10
martinhu| | 2020-12-16 15:42 | 只看该作者
hzqy110 发表于 2020-12-16 14:59
0到3的定时器都可以正常,以前用ST的单片机时候没遇到过这种情况,也用高级定时器做PWM输出使用,都是正 ...

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

使用特权

评论回复
11
wangxx158| | 2020-12-20 17:05 | 只看该作者
我也遇到过类似的情况,ST的新唐的都可以把对应的PWM数据设置为了0时输出低电平,后面我解决了,你把stcAdtBaseCntCfg.enCntDir = AdtCntUp;屏蔽掉就可以了.

使用特权

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

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

使用特权

评论回复
评论
botang6666 2021-7-13 16:35 回复TA
最近调试F460也遇到这个问题,计数方向从递增变为递减,输出电平改一下,相当于原来占空比不能到0变成了占空比到不了100%,把这个问题给规避掉了,我是用来控制电机的,占空比用不到100% 
13
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
...

使用特权

评论回复
14
sgrtf661| | 2021-7-14 16:07 | 只看该作者
华大代理 可以做技术支持 QQ:409946461

使用特权

评论回复
15
asmine| | 2021-7-14 16:40 | 只看该作者
应该不是杂波,可能还是定时器的事

使用特权

评论回复
16
自己造声卡| | 2021-7-14 17:08 | 只看该作者
先测试IO口的高低电平,是否有问题、

使用特权

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

本版积分规则

11

主题

26

帖子

0

粉丝