关于智能小车基于STM32和传感器码盘的测速

​​​​​​(智能小车)STM32+L298N+光电/霍尔传感器+串口/OLED屏测速,测速值通过IIC可以显示到OLED,亲测。(程序代码注释详细)_m0_54195456的博客-CSDN博客

光电传感器有遮挡时,输出高电平;无遮挡,输出低电平。我们接受到一次低电平时,把这个脉冲加一,轮子上有编码圈一圈可以让脉冲累加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);}
 //定时器4void 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); //配置 TIM4TIM_Cmd(TIM4, ENABLE); //使能TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE ); //开启定时器4,
//进入一次中断1Msvoid 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

 

  • 3
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 12
    评论
STM32中,光电码盘测速是通过光电编码器实现的。光电编码器由光源、光码盘和光敏元件组成。光栅盘是在一定直径的圆板上等分地开通若干个长方形孔。当电动机旋转时,光栅盘与电动机同速旋转。光电编码器通过检测光栅盘上的脉冲信号来计算电动机的转速。\[3\] 在STM32编码器模式中,A相和B相每产生一个上升沿或者下降沿,计数器就会加1。通过测量单位时间内A相和B相输出的脉冲数,可以得到电动机的速度信息。可以使用M法、T法或M/T法来测量速度。M法是通过检测脉冲个数来获得被测速度,适用于测量高速速度。T法是测量相邻两个脉冲间的时间,再来反算速度,适用于测量低速速度。M/T法是同时测量检测时间和在此时间内脉冲发生器发出的脉冲个数来测量速度。\[1\] 另外,为了提高编码器的精度,可以使用编码器倍频的方法。通过测量A相和B相编码器的上升沿和下降沿,可以在同样的时间内计数更多次,从而提高精度。这是一种实用的技术,可以将编码器的精度提升4倍。\[2\] #### 引用[.reference_title] - *1* *3* [STM32(HAL库)——光电编码器、M/T法测量电机转速](https://blog.csdn.net/DIVIDADA/article/details/130198779)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [STM32——编码器测速原理及STM32编码器模式](https://blog.csdn.net/cyj972628089/article/details/112852960)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值