新手上路
- 积分
- 21
- 金钱
- 21
- 注册时间
- 2021-8-10
- 在线时间
- 5 小时
|
5金钱
使用的芯片是stm32F407ZGT6,做的项目是一个小车。
问题具体描述:
如第一张图,motor_init()是使用TIM8的通道1到4设置一个PWM的输出,经过测试,它必须要放在前面初始化才能正常输出、以及使用TIM_SetCompareX()来设置PWM
后面的uart_init()和encoder_init()确定在IO口上和motor_init()没有冲突,那为什么会出现这种问题呢?
程序在正点原子的探索者开发板和另外一个厂商的核心板上都测试过,所以应该和板子没有关系。
大家有遇到过类似的问题吗?
本人是初学者,希望能得到解答,感谢!
这是用来测试的程序:
下面是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);
}
|
|