|
本帖最后由 书9500 于 2016-12-8 17:53 编辑
跪求大神帮我解决问题。
我用TIM1的输出通道1(PA8)和输出通道4(PA11)做PWM输出控制电机,USART1做普通收发用PA9和PA10,理论上不会有什么冲突。但是,现在的问题是这样的,我TIM1和USART1分别进行初始化后,当先调用USART1初始化函数后调用TIM1初始化函数时,TIM1的输出通道OC1竟然不好使(也就是PA8);只有先初始化TIM1在初始化USART1才能好使。(PA11也就是OC4并不受影响)附上代码如下
/**初始化调用函数如下**/
//不知道为什么必须先初始化PWM函数再初始化串口函数
//调转的话就不好使。
MOTOR_PWM_Configuration();
Usart1_Configuration();
/*初始化函数实现如下*/
我的时钟有一个专门的函数来开启,在主函数里调用。
void RCC_Configuration(void)
{
//SystemInit();
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE );
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOC, ENABLE );
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
PWR_BackupAccessCmd(ENABLE);//取消备份区保护
RCC_LSEConfig(RCC_LSE_OFF);//外部低速振荡器关闭,释放PC15、PC14
BKP_TamperPinCmd(DISABLE);//侵入检测TAMPER引脚PC13作为通用IO口使用
BKP_ITConfig(DISABLE);//打开备份区保护
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable , ENABLE); //关闭JTAG功能,使用SWD功能PB4
}
/** 函数名称:电机PWM配置函数
** 函数功能:配置两个电机的PWM输入引脚以及方向控制引脚
* 参 数:无
* 返 回 值:无
* 说 明: pwm | 方向
________________|_____________|
电机1 A电机 PA.8| PB.14/PB.15 |
________________|_____________|
电机2 B电机PA.11| PB.12/PB.13 |
________________|_____________|
电机使能 常开
______________________________|
* 备 注:2015/08/05_
**/
void MOTOR_PWM_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
/*配置GPIO端口*/
/***********************************/
/*配置PWM输出端口*/
// GPIO_StructInit(&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_11; //
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/*配置方向控制端口*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15; //PA.0 PA.1 PA.2端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
/***********************************/
/*定时器频率设定作为PWM的频率 10KHZ */
/***********************************/
TIM_DeInit(TIM1);
TIM_TimeBaseStructure.TIM_Period=7199;//初值 电机频率为10KHZ
TIM_TimeBaseStructure.TIM_Prescaler=0;//不分频
TIM_TimeBaseStructure.TIM_ClockDivision=0;
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;//向上
TIM_TimeBaseInit(TIM1,&TIM_TimeBaseStructure);
TIM_ARRPreloadConfig(TIM1,ENABLE); //
/***********************************/
/*PWM占空比设定*/
/***********************************/
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式1
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
TIM_OCInitStructure.TIM_Pulse =5000; //设置待装入捕获比较寄存器的脉冲值
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
TIM_OC1Init(TIM1, &TIM_OCInitStructure); //左电机PWM信号
TIM_OC4Init(TIM1, &TIM_OCInitStructure); //右电机PWM信号
/***********************************/
/***********************************/
TIM_OC1PreloadConfig(TIM1,TIM_OCPreload_Enable);
TIM_OC4PreloadConfig(TIM1,TIM_OCPreload_Enable);
TIM_Cmd(TIM1,ENABLE);
TIM_CtrlPWMOutputs(TIM1,ENABLE); //
}
/**串口初始化函数**/
void Usart1_Configuration(void)
{
//GPIO端口设置
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
USART_DeInit(USART1); //复位串口1
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化PA9
//USART1_RX PA.10
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化PA10
//USART 初始化设置
USART_InitStructure.USART_BaudRate = 115200;//波特率;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位
USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制
USART_InitStructure.USART_Mode = USART_Mode_Rx|USART_Mode_Tx; //收发模式
USART_Init(USART1, &USART_InitStructure); //初始化串口
USART_Cmd(USART1, ENABLE); //使能串口
}
|
|