智能小车红外测速模块的使用方法(基于STM32的标准库)

基于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中的随笔录,并非专业的开发人员,代码上或多或少存在不足之处,欢迎各位指正。

(3)发帖的初衷于在使用STM32做智能小车的红外测速模块中,缺少比较详细的讲解,为此写下这篇文章,希望可以帮助大一新生喜欢智能车的萌新解惑。

  • 9
    点赞
  • 62
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值