新手上路
- 积分
- 29
- 金钱
- 29
- 注册时间
- 2014-6-23
- 在线时间
- 0 小时
|
5金钱
用stm32芯片控制两个带编码器的步进电机,现在是TIM1的通道1和2做右电机的编码器输入而通道3和4做左电机的控制输出。请问该怎么设置 TIM1让它在接收右电机编码器的信号时还能对左电机进行调速控制。现在遇到的问题时当不设置TIM1的编码器模式只设置PWM输出时,对左电机可以正常控制和调速。但当TIM1的编码器模式和PWM输出模式同时开启时,电机不受TIM1控制,电机向一个方向最高速运行,改变TIM1通道3和通道4都没用。请各位大侠帮忙想想办法,怎么样才能使TIM1正常工作。下面是我的TIM1的初始化程序。
void Time1_Configuration(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure; //TIM输出比较结构体定义 设置通道3和通道4
TIM_ICInitTypeDef TIM_ICInitStructure; //TIM输入比较结构体定义 设置通道1和通道2 可是我的程序里面没有专门的通道设置 是填入的默认值
TIM_TimeBaseStructure.TIM_Period = (SYSCLK_FREQ/3)/MOTOR_DRIVER_FREQ-1; //这一部分是编码器和PWM波共用的部分 是对应PWM波输出设置的
TIM_TimeBaseStructure.TIM_Prescaler = 3-1; //PWM输出频率最大为72M-9=8M
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //不分频
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数
TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); //初始化TIMx的时基单元
//对通道3的PWM波输出设置
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Inactive; //被动输出模式 强制输出低电平
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //输出使能
TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Disable; //互补失能
TIM_OCInitStructure.TIM_Pulse = 50; //占空比设置
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //高电平有效
//高级定时器部分初始化设置
TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_Low;
TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;
TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;
TIM_OC3Init(TIM1, &TIM_OCInitStructure); //初始化TIM1的3通道
TIM_OC3PreloadConfig(TIM1, TIM_OCPreload_Enable); //使能TIM1在CCR3上的预装载寄存器
//通道4设置 基本与通道3一样
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Inactive;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Disable;
TIM_OCInitStructure.TIM_Pulse = 50;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_Low;
TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;
TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;
TIM_OC4Init(TIM1, &TIM_OCInitStructure);
TIM_OC4PreloadConfig(TIM1, TIM_OCPreload_Enable);
TIM_ARRPreloadConfig(TIM1, ENABLE); // 使能TIM1在ARR上的预装载寄存器
///////////////////////////////////////编码器设置部分
TIM_DeInit(TIM1); //将外设TIMx寄存器重设为缺省值
TIM_EncoderInterfaceConfig(TIM1, TIM_EncoderMode_TI12, TIM_ICPolarity_Falling, TIM_ICPolarity_Falling); //编码器模式3在AB两相的上下沿都计数
TIM_ICStructInit(&TIM_ICInitStructure); //让每个TIM_ICInitStruct成员设为默认值 个人认为这里是问题的关键 这里可能把TIM1的通道3和4也默认设置了导致PWM波不能输出
TIM_ICInitStructure.TIM_ICFilter = 6; //输入滤波器
TIM_ICInit(TIM1, &TIM_ICInitStructure); //初始化TIM1的外设
TIM_ClearFlag(TIM1, TIM_FLAG_Update); //清除TIMx的待处理标志位
TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE); //开启定时器中断
//Reset counter
TIM_SetCounter(TIM1, 0); //设置计数值为0
TIM_Cmd(TIM1, ENABLE); //TIM1开启
TIM_CtrlPWMOutputs(TIM1, ENABLE); //使能外围输出 关闭后会使PWM没有输出
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
程序的其他部分没有写,这是出问题的部分。主要是用到了定时器的溢出中断和比较中断。
那位大侠帮我解决问题,小弟感激不尽。好人一生平安!
|
|