新手入门
- 积分
- 5
- 金钱
- 5
- 注册时间
- 2020-3-28
- 在线时间
- 1 小时
|
1金钱
stm32f103系列单片机,将2个霍尔接近开关通过电路设计接高电平,磁铁靠近,开关闭合,高电平导通进入单片机定时器的tim2的1和2通道,对该定时器进行编码器配置。但是原子哥的视频里面没有该配置,我查找相关资料,摸索了一下,整体框架配出来了,但是某些地方还不对,得不到我想要的现象。
void Encoder_Init(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_ICInitTypeDef TIM_ICStructure; //设置输入比较参数,开启输入捕获
GPIO_InitTypeDef GPIO_InitStructure; //引脚配置
NVIC_InitTypeDef NVIC_InitStructure;
//配置GPIO
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //配置两个管脚的模式
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 + GPIO_Pin_1;
GPIO_Init(GPIOA, &GPIO_InitStructure);
//使能时钟
////RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
////RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
/* Timer configuration in Encoder mode */
TIM_DeInit(TIM2);
TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
TIM_TimeBaseStructure.TIM_Prescaler = 0x00; //配置预分频,此值+1为分频的除数
TIM_TimeBaseStructure.TIM_Period = (uint16_t)0xffff; //自动装载值
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;//配置时钟因子
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;// 配合成向上计数
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
TIM_EncoderInterfaceConfig(TIM2, TIM_EncoderMode_TI12,
TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);//TIM_EncoderInterfaceConfig是配置定时器的编码器接口函数。TIM_ICPolarity_Rising:上升沿捕获,编码器模式1
TIM_ICStructInit(&TIM_ICStructure);
TIM_ICStructure.TIM_ICPrescaler = TIM_ICPSC_DIV4;
TIM_ICStructure.TIM_ICFilter = 00;//ICx_FILTER;设置滤波器长度
TIM_ICInit(TIM2, &TIM_ICStructure);
//Clear all pending interrupts
TIM_ClearFlag(TIM2, TIM_FLAG_Update);//清除 TIM2 的待处理标志位
TIM_ITConfig(TIM2, TIM_IT_CC1, ENABLE);//允许更新中断和允许cc1TIM_IT_CC1 TIM_IT_CC1||TIM_IT_Update
//Reset counter
TIM2->CNT = 0;//复位后的计数器的值
// ENC_Clear_Speed_Buffer();
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;//抢断优先级设置为0
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;//响应优先级设置为1
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
TIM_Cmd(TIM2, ENABLE);
}
void TIM2_IRQHandler(void)
{
//TIM2CH1_CAPTURE_STA = 1;
//TIM3CH1_CAPTURE_VAL=TIM_GetCounter(TIM3);
//TIM3CH1_CAPTURE_oldVAL = TIM3CH1_CAPTURE_VAL;
//TIM3CH1_deviation = TIMwy;
//bac++;
if(TIM_GetITStatus(TIM2,TIM_IT_CC1)!=RESET){
RingBuf_Write(PAD_ID_Spider);
RingBuf_Write(9);
RingBuf_Write(TRANNINGBACK);
RingBuf_Write(TIMwy);
RingBuf_Write(u16tou8(TIM_GetCounter(TIM3),'H'));
RingBuf_Write(u16tou8(TIM_GetCounter(TIM3),'L'));
RingBuf_Write((TIM2->CR1&1<<4));
RingBuf_Write(Eot);
RingBuf_Write(CalcCrc(TxBuffer,TxBuffer[1]-1));
TIMwy = 0;
TIM_SetCounter(TIM3,0);
}
//TIM2CH1_CAPTURE_STA = 0;
TIM_ClearITPendingBit(TIM2, TIM_IT_CC1|TIM_IT_Update); //清除中断标志位TIM_IT_CC1|
}
|
|