基于STM32标准库编程实现智能小车的红外测速所需掌握的知识:
(1)外部中断的配置
(2)定时器的配置
(3)串口的配置
红外测速的核心思路:
(1)红外测速模通电后,会发出红外线,利用测速盘对红外线进行遮光,使测速模块连接STM32的中断引脚触发中断。每次发生中断,就进入一次中断服务函数,对遮光次数进行累加并记录。
(2)配置定时器为0.01s触发一次中断,每次中断程序自动进入定时器的中断服务函数,设置一个定时器中断次数的计数值,使用if语句判断定时器中断次数如果为100次,即为1s的时间定时,就进行速度的处理。
(3)计算公式:路程 = [ (总遮光次数 / 测速盘孔数) * 2πR / 1000 ]
注意事项:
(1)总遮光次数 / 测速盘孔数 = 测速盘转的圈数
(2)R即为车轮半径,单位为mm,除以1000转换单位为m,易于计算速度单位为m/s
(3)速度 = 路程 / t (t=1s)
STM32基于标准库编程的代码:
外部中断配置:
void Exti2_Init(void)
{
//使能端口A的硬件时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
//配置PA2为输入模式
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);
//使能系统时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
//将PA2和EXTI2连接一起
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource2);
//外部中断配置
EXTI_InitStructure.EXTI_Line = EXTI_Line2;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
//配置中断优先级及中断请求
NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
定时器的配置:
oid Time4_Init(void)
{
//使能硬件时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE); //0.01s定时,100个0.01s则为1s
//配置分频值,计数值
TIM_TimeBaseStructure.TIM_Period = (10000/100)-1; //T=1/100,(10000/100)=100完成一个计数所需的时间,则1s时间到达需要100个计数值
TIM_TimeBaseStructure.TIM_Prescaler = 7200-1; //36MHz=36000000/3600=10000Hz 的预分频
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);
//将PB0引脚连接到定时器4,在此用不到
GPIO_PinRemapConfig(GPIO_Remap_TIM4,ENABLE);
//配置定时器4触发方式
TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE);
//配置定时器中断优先级
NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
//使能定时器
TIM_Cmd(TIM4,ENABLE);
串口配置:
void Usart1_Init_2BlueTooth(uint32_t baud)
{
//配置串口1相关参数:波特率,无校验位,8位数据位,停止位
USART_InitStructure.USART_BaudRate = baud; //波特率
USART_InitStructure.USART_WordLength = USART_WordLength_8b; //八个数据位
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);
//配置串口1中断触发方法:接收一个字节触发中断
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
//配置串口1的中断优先级
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
//使能串口1工作
USART_Cmd(USART1, ENABLE);
}
公式所需的变量:
int number = 0; //遮光的计数值
int _1s_number = 0; //定时器中断次数的计数值,100次即为1s
int Diameter = 65.0000; //小车车轮的直径
float Send_Speed; //使用printf向串口发送速度数据
float pi = 3.1415926; //π
中断服务函数:
void EXTI2_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line2) != RESET)
{
number++;
EXTI_ClearITPendingBit(EXTI_Line2);
}
}
void TIM4_IRQHandler(void)
{
if(TIM_GetITStatus(TIM4,TIM_IT_Update)==SET)
{
_1s_number++;
if(_1s_number==100)
{
float Speed = ((number/20.0000)*pi*Diameter)/1000.0000;
Send_Speed = Speed;
printf("%.4f\n",Speed);
number=0;
_1s_number=0;
}
TIM_ClearITPendingBit(TIM4,TIM_IT_Update);
}
}
主函数:
int main()
{
Usart1_Init_2BlueTooth(115200);
Time4_Init();
Exti2_Init();
while(1)
{
}
return 0;
}
结语:
(1)由于设计智能小车整体代码,作者只能将红外测速模块的代码分部呈现,希望谅解。
(2)作者非重本大一生,在学习STM32中的随笔录,并非专业的开发人员,代码上或多或少存在不足之处,欢迎各位指正。文章来源:https://www.toymoban.com/news/detail-761135.html
(3)发帖的初衷于在使用STM32做智能小车的红外测速模块中,缺少比较详细的讲解,为此写下这篇文章,希望可以帮助大一新生喜欢智能车的萌新解惑。文章来源地址https://www.toymoban.com/news/detail-761135.html
到了这里,关于智能小车红外测速模块的使用方法(基于STM32的标准库)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!