本文主要是介绍STM32F030编码器模式不能正常工作,STM32F103上面可以正常运行 解决方案,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
STM32F030编码器模式不能正常工作,STM32F103上面可以正常运行 解决方案
- STM32F103程序
- STM32F030程序
- 原理图纸
- 找到原因,开始解决问题
- 解决方案
STM32F030编码器模式不能正常工作,STM32F103上面可以正常运行 解决方案
STM32F103程序
void Position_Encoder_Init(void)//time3
{TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;TIM_ICInitTypeDef TIM_ICInitStructure; //定时器捕获结构体定义
// NVIC_InitTypeDef NVIC_InitStructure;GPIO_InitTypeDef GPIO_InitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);//使能定时器4的时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//使能PB端口时钟GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;//PA6和PA7设置为编码器AB相GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入GPIO_Init(GPIOB, &GPIO_InitStructure); TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);TIM_TimeBaseStructure.TIM_Prescaler = 0x0; // 预分频器 TIM_TimeBaseStructure.TIM_Period = ENCODER_TIM_PERIOD; //设定计数器自动重装值TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;//选择时钟分频:不分频TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;TIM向上计数 TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);TIM_EncoderInterfaceConfig(TIM3, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);//使用编码器模式3TIM_ICStructInit(&TIM_ICInitStructure);TIM_ICInitStructure.TIM_ICFilter = 10;TIM_ICInit(TIM3, &TIM_ICInitStructure);TIM_ClearFlag(TIM3, TIM_FLAG_Update);//清除TIM的更新标志位TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);
/* NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn; //TIM3中断NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; //先占优先级2级NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; //从优先级1级NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器*///Reset counterTIM_SetCounter(TIM3,0);TIM_Cmd(TIM3, ENABLE); TIM3->CNT = 0;
}
STM32F030程序
void Position_Encoder_Init(void)//time3
{GPIO_InitTypeDef GPIO_InitStructure;TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;TIM_ICInitTypeDef TIM_ICInitStructure; //定时器捕获结构体定义
// NVIC_InitTypeDef NVIC_InitStructure;RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);//使能GPIO时钟GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;//PA6和PA7设置为编码器AB相GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; //设置为输入模式GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;//浮空输入GPIO_Init(GPIOA, &GPIO_InitStructure);RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);//使能定时器3的时钟TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);TIM_TimeBaseStructure.TIM_Prescaler = 0x0; // 预分频器 TIM_TimeBaseStructure.TIM_Period = ENCODER_TIM_PERIOD; //设定计数器自动重装值TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;//选择时钟分频:不分频TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;TIM向上计数 TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);TIM_EncoderInterfaceConfig(TIM3, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);//使用编码器模式3TIM_ICStructInit(&TIM_ICInitStructure);TIM_ICInitStructure.TIM_ICFilter = 6;TIM_ICInit(TIM3, &TIM_ICInitStructure);TIM_ClearFlag(TIM3, TIM_FLAG_Update);//清除TIM的更新标志位TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);
// TIM3->CCMR1 |= TIM_CCMR1_CC1S_0 | TIM_CCMR1_CC2S_0; /* (1)*/
// TIM3->CCER &= (uint16_t)(~(TIM_CCER_CC1P | TIM_CCER_CC2P)); /* (2) */
// TIM3->SMCR |= TIM_SMCR_SMS_0 | TIM_SMCR_SMS_1; /* (3) */
// TIM3->CR1 |= TIM_CR1_CEN; /* (4) */
//
// NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; //TIM3中断
// NVIC_InitStructure.NVIC_IRQChannelPriority = 1; //先占优先级2级
// NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
// NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器
// //Reset counterTIM_SetCounter(TIM3,0);
// TIM3->CNT = 0; 两个同一个效果TIM_Cmd(TIM3, ENABLE);
}
中断代码
void TIM3_IRQHandler(void)
{ if(TIM3->SR&0X0001)//溢出中断{LED2 = 0;}TIM3->SR&=~(1<<0);//清除中断标志位
}
原理图纸
用的是差分编码器,现在用的程序模拟输出然后接入光耦输入。
光耦信号输出正常,单片机IO口输入也正常,程序可以读取电平信号输入
现在就是不知道到底哪个环节出了问题
STM32F030C8T6编码器输入IO口
STM32F030的TIM3也有挂在APB1总线上,资源也没有问题
尝试了好久,不知道为什么不运行,TIM_GetCounter(TIM3)获取编码器计数值一直是0,有没有遇到此问题的,路过帮忙解决下。
不然只能用中断IO做了
找到原因,开始解决问题
1.TIME3定时器的TI1、TI2没有没有重映射到相关引脚
解决方案
1.设置相关IO口为复用模式,浮空输入。
不设置复用模式,编码器计数值返回0。
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);//使能GPIO时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;//PA6和PA7设置为编码器AB相
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //设置为复用模式
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;//浮空输入
GPIO_Init(GPIOA, &GPIO_InitStructure);
2.设置相关IO 重映射
GPIO_PinAFConfig(GPIOA, GPIO_PinSource6 , GPIO_AF_1); //PA6-->TIM3_CH1
GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_1); //PA7-->TIM3_CH2
void GPIO_PinAFConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_PinSource, uint8_t GPIO_AF)
第一个参数GPIOx: 传入我们要进行映射的GPIO端口,这里使用的是GPIOA。
第二个参数GPIO_PinSource: 设置要进行重映射的IO口号GPIO_PinSourceX,最后一个X就是对应设置的IO号(0-15),这是使用的是GPIO_PinSource6、GPIO_PinSource7。
第三个参数GPIO_AF: 也就是下面定义的映射关系,这里重映射的是TIM3找到所对应的就是GPIO_AF_1,那就传入GPIO_AF_1啦。
#define GPIO_AF_0 ((uint8_t)0x00) /* WKUP, EVENTOUT, TIM15, SPI1, TIM17,MCO, SWDAT, SWCLK, TIM14, BOOT,USART1, CEC, IR_OUT, SPI2 */
#define GPIO_AF_1 ((uint8_t)0x01) /* USART2, CEC, Tim3, USART1, USART2,EVENTOUT, I2C1, I2C2, TIM15 */
#define GPIO_AF_2 ((uint8_t)0x02) /* TIM2, TIM1, EVENTOUT, TIM16, TIM17 */
#define GPIO_AF_3 ((uint8_t)0x03) /* TS, I2C1, TIM15, EVENTOUT */
#define GPIO_AF_4 ((uint8_t)0x04) /* TIM14 */
#define GPIO_AF_5 ((uint8_t)0x05) /* TIM16, TIM17 */
#define GPIO_AF_6 ((uint8_t)0x06) /* EVENTOUT */
#define GPIO_AF_7 ((uint8_t)0x07) /* COMP1 OUT and COMP2 OUT */
注意一定不要写成,不然还是不会正常工作,只会计数一次
GPIO_PinAFConfig(GPIOA, GPIO_PinSource6 | GPIO_PinSource7 , GPIO_AF_1);
这篇关于STM32F030编码器模式不能正常工作,STM32F103上面可以正常运行 解决方案的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!