OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5688|回复: 2

同时使用多个模块时,PWM输出的初始化顺序问题

[复制链接]

2

主题

5

帖子

0

精华

新手上路

积分
21
金钱
21
注册时间
2021-8-10
在线时间
5 小时
发表于 2021-8-11 17:52:15 | 显示全部楼层 |阅读模式
5金钱
    使用的芯片是stm32F407ZGT6,做的项目是一个小车。

问题具体描述:
    如第一张图,motor_init()是使用TIM8的通道1到4设置一个PWM的输出,经过测试,它必须要放在前面初始化才能正常输出、以及使用TIM_SetCompareX()来设置PWM
    后面的uart_init()和encoder_init()确定在IO口上和motor_init()没有冲突,那为什么会出现这种问题呢?
    程序在正点原子的探索者开发板和另外一个厂商的核心板上都测试过,所以应该和板子没有关系。
    大家有遇到过类似的问题吗?
    本人是初学者,希望能得到解答,感谢!
    屏幕截图 2021-08-11 173205.png
    这是用来测试的程序:
屏幕截图 2021-08-11 174256.png

    下面是motor_init()具体的设置步骤(本人看着正点原子的例程改的,单独使用时正常,和其它模块一起用时就出现了上面的问题)
void motor_init(u8 freq_khz){
        GPIO_InitTypeDef                         GPIO_InitStructure;
        TIM_TimeBaseInitTypeDef          TIM_TimeBaseStructure;
        TIM_OCInitTypeDef                          TIM_OCInitStructure;
               
        //时钟使能和IO复用
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM8, ENABLE);       
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);       
       
        //配置定时器通道
        GPIO_InitStructure.GPIO_Pin         = GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9;
        GPIO_InitStructure.GPIO_Mode         = GPIO_Mode_AF;
        GPIO_InitStructure.GPIO_Speed         = GPIO_Speed_100MHz;
        GPIO_InitStructure.GPIO_OType         = GPIO_OType_PP;      
        GPIO_InitStructure.GPIO_PuPd         = GPIO_PuPd_UP;        
        GPIO_Init(GPIOC, &GPIO_InitStructure);
        GPIO_PinAFConfig(GPIOC, GPIO_PinSource6, GPIO_AF_TIM8);
        GPIO_PinAFConfig(GPIOC, GPIO_PinSource7, GPIO_AF_TIM8);
        GPIO_PinAFConfig(GPIOC, GPIO_PinSource8, GPIO_AF_TIM8);
        GPIO_PinAFConfig(GPIOC, GPIO_PinSource9, GPIO_AF_TIM8);
        //PWM频率的限制(具体的合适的值得看电机,不过根据网上的说法,似乎至少1khz才能调速)
        if(freq_khz <= 1){        freq_khz = 1;        }
        else if(freq_khz >= 50){        freq_khz = 50;        }       
        //时基单元设置
        TIM_TimeBaseStructure.TIM_Period                 = 1000-1;                        //PWM频率 = ((168M/168)*freq_khz)/(1000)  【这样设置,freq_khz为2时,频率为2khz】【网上找的公式】
        TIM_TimeBaseStructure.TIM_Prescaler         = 168/freq_khz - 1;        //由F4的内部时钟树可知,TIM8的时钟源频率是168M  【更改计时器时注意时钟源!】
        TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
        TIM_TimeBaseStructure.TIM_CounterMode         = TIM_CounterMode_Up;
        TIM_TimeBaseInit(TIM8, &TIM_TimeBaseStructure);
        //PWM输出设置
        TIM_OCInitStructure.TIM_OCMode                         = TIM_OCMode_PWM1;                        //模式1,CNT < CCRx,有效电平(向上计数)
        TIM_OCInitStructure.TIM_OutputState         = TIM_OutputState_Enable;        //使能
        TIM_OCInitStructure.TIM_Pulse                         = 0;                                            //占空比初始化
        TIM_OCInitStructure.TIM_OCPolarity                 = TIM_OCPolarity_High;                //有效电平为高电平
        TIM_OC1Init(TIM8, &TIM_OCInitStructure);                        //通道1
        TIM_OC2Init(TIM8, &TIM_OCInitStructure);                        //通道2
        TIM_OC3Init(TIM8, &TIM_OCInitStructure);                        //通道3
        TIM_OC4Init(TIM8, &TIM_OCInitStructure);                        //通道4
       
        //电机方向IO(作为普通输出IO进行设置)
        GPIO_InitStructure.GPIO_Pin         = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
        GPIO_InitStructure.GPIO_Mode         = GPIO_Mode_OUT;                //普通输出模式
        GPIO_InitStructure.GPIO_OType         = GPIO_OType_PP;                //推挽输出
        GPIO_InitStructure.GPIO_Speed         = GPIO_Speed_50MHz;                //50MHz
        GPIO_InitStructure.GPIO_PuPd        = GPIO_PuPd_DOWN;               
        GPIO_Init(GPIOD, &GPIO_InitStructure);
       
        //使能
        TIM_Cmd(TIM8, ENABLE);  
        TIM_CtrlPWMOutputs(TIM8, ENABLE);
}

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165377
金钱
165377
注册时间
2010-12-1
在线时间
2111 小时
发表于 2021-8-12 01:58:15 | 显示全部楼层
仿真看下寄存器变化,就知道哪里了,估计是互相初始化之间有寄存器设置冲突
回复

使用道具 举报

4

主题

896

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4309
金钱
4309
注册时间
2019-9-4
在线时间
896 小时
发表于 2021-8-12 10:42:28 | 显示全部楼层
uart_init()和encoder_init()代码也要贴出来呀,不然也看不出来是为什么冲突了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-27 05:32

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表