关于智能小车基于STM32和传感器码盘的测速
Posted 我是可爱的小朋友
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于智能小车基于STM32和传感器码盘的测速相关的知识,希望对你有一定的参考价值。
光电传感器有遮挡时,输出高电平;无遮挡,输出低电平。我们接受到一次低电平时,把这个脉冲加一,轮子上有编码圈一圈可以让脉冲累加20次。我用了2个定时器和两个外部中断,定时器分别用来仿PWM输出和定时,外部中断分别用来光电传感器的输出(输出的高低电平会输入到单片机的IO口)和按键输入控制电机转动。现在PWM输出暂时可以不用管。定时器定时1ms秒,检测是否接受到传感器输入脉冲,计时1S后将脉冲累计的值(该值设为num)num/20返回我们的结果为每秒轮子所转的圈数。将该结果每秒的转速显示到OLED上,当然,也可以自己稍微修改代码用串口输出并显示。
下面来看测速用到的几个代码段
//触发传感器输入
void INIT_GD(void) //Key0
{
GPIO_InitTypeDef GPIO_InitStruct; //结构体
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //时钟
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPD; //下拉
GPIO_Init(GPIOB, &GPIO_InitStruct);
}
//定时器4
void TIM4_inIt(void)
{
//结构体
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;
//时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
//配置中断
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn; //TIM3通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢占优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //子优先级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能
NVIC_Init(&NVIC_InitStructure); //配置
TIM_TimeBaseStructure.TIM_Period = 999; //重装载寄存器
TIM_TimeBaseStructure.TIM_Prescaler =71; //预分频
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM4向上计数
TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); //配置 TIM4
TIM_Cmd(TIM4, ENABLE); //使能
TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE ); //开启定时器4,
//进入一次中断1Ms
void TIM4_IRQHandler(void)
{
if (TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET) //1ms
{
TIM_ClearITPendingBit(TIM4, TIM_IT_Update );
time++;
//测每秒的转速,每一秒更新一次
if(Key0 == 1)
flag=1;
if(Key0==0 && flag==1)
{
flag=0; //清除标志
num=num+1; //传感器触发次数
}
if(time == 1000) //计时1S,计算转速
{
Circle=num/20; //转速
time=0;
num=0;
}
}
}
详细代码链智能小车基于STM32的测速,亲测https://blog.csdn.net/m0_54195456/article/details/121042194
以上是关于关于智能小车基于STM32和传感器码盘的测速的主要内容,如果未能解决你的问题,请参考以下文章
毕业设计 - 题目:基于 STM32 的自动泊车系统 -智能小车 自动停车