首页 > 其他分享 >循迹小车驱动

循迹小车驱动

时间:2024-02-24 17:00:40浏览次数:23  
标签:TIM3 循迹 中断 小车 NVIC TIM InitStructure 驱动 GPIO

1.PWM

2.USART

3.GPIO

4.ADC

技术部分

EXIT

HC_SR04 中断定时器
EXIT 外部中断 属于外设 可监测GPIO口的电平信号
触发方式 上升 下降 双边 PB7与PA7不能同时使用中断 与AFIO有关中断引脚选择器只会选择其中一个
中断 暂停当前正在运行的程序。转而处理中断程序,处理完成后返回原来的位置继续经行
中断源 电平跳变 接受到数据 到达预定时间
中断有自己的优先级 抢占优先级>响应优先级,同级优先级高的先执行
中断可以嵌套
中断触发后响应方式 中断方式/事件响应
NVIC 管理中断 设优先级 NVIC可设置高N位抢占优先级 低4-N位的响应优先级
驱动 外部中断配置流程
1.开启时钟(GPIO AFIO就可以了EXIT一直开启 NVIC属于内部设备)
2.GPIO 输入模式
3.配置AFIO 选择GPIO 连接到 EXIT
4.配置中断边沿触发方式 上升下降 双边,选择响应方式 中断响应 / 事件响应
5.配置NVIC 进入CPU
6.中断函数(无参无返回值 名字固定 在启动文件中找)

TIM

TIM定时器
定时器中断 配置流程
1.开启RCC时钟
2.选择实际单元时钟源
3.配置时基单元
4.配置输出中断控制,允许中断更新到NVIC(计数器达到ARR的值 会出现一个中断)
5.配置NVIC
6.运行计数器

得到高电平的维持时间(TIM输入捕获 IC)
1.RCC开启时钟
2.GPIO初始化,设置为输入模式
3配置时基单元
4.配置输入捕获单元
5.选择从模式的触发源
6.触发后的操作
#include "stm32f10x.h"                  // Device header
extern uint16_t NUM;
int flag = 0,times;

void IC_Init(void)
{
	
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//开启时钟
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;//输入模式不需要设置速率
	GPIO_Init(GPIOB,&GPIO_InitStructure);
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource6);//选择中断的GPIOx 和线路 数字要与输入的GPIO口的数字对应
	
	EXTI_InitTypeDef InitStructure;
	InitStructure.EXTI_Line = EXTI_Line6; //与GPIO口的数字对应
	InitStructure.EXTI_LineCmd = ENABLE;//开启中断
	InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//中断响应事件 为中断事件
	InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling;//边沿触发方式
	EXTI_Init(&InitStructure);
	
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//优先级分配
	NVIC_InitTypeDef NVIC_InitStructure;
	NVIC_InitStructure.NVIC_IRQChannel =   EXTI9_5_IRQn;//配置NVIC通道
	NVIC_InitStructure.NVIC_IRQChannelCmd =ENABLE;//使能
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;//抢占优先级
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;//响应优先级
	NVIC_Init(&NVIC_InitStructure);
	
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
	TIM_InternalClockConfig(TIM3);//选择内部时钟
	
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
	TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;//TIM_CKD_DIVx 代表x 72M要被分为多少个
	TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;//向上计数
	TIM_TimeBaseInitStruct.TIM_Period = 1000-1;//TIM_Prescaler装1000次 与CNT CCR同级
	TIM_TimeBaseInitStruct.TIM_Prescaler = 72-1;//每产生义一个tips加1,加到72归零,TIM_Period+1
	TIM_TimeBaseInitStruct.TIM_RepetitionCounter = 0;//高级定时器使用 这里给0
	TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStruct);
	TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);//时钟触发中断
	
	NVIC_InitTypeDef NVIC_InitStructure2;
	NVIC_InitStructure2.NVIC_IRQChannel = TIM3_IRQn;//来自TIM3的中断
	NVIC_InitStructure2.NVIC_IRQChannelCmd = ENABLE;
	NVIC_InitStructure2.NVIC_IRQChannelPreemptionPriority = 1;//抢占优先级1
	NVIC_InitStructure2.NVIC_IRQChannelSubPriority = 1;//响应优先级1
	NVIC_Init(&NVIC_InitStructure2);
	/***********IC********************************/
	
	
}


void TIM3_IRQHandler(void)
{
	if(TIM_GetITStatus(TIM3,TIM_IT_Update) == SET)
	{
		NUM++;
		TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
	}
}
void  EXTI9_5_IRQHandler(void)
{
	if(SET == EXTI_GetITStatus(EXTI_Line6))
	{
		if(flag == 0)
		{
			NUM=0;flag=1;//0为第一个双边沿,1为第二个双边沿
			TIM_SetCounter(TIM3,0);//设置TIM3的CNT为0
			TIM_Cmd(TIM3,ENABLE);//开始计时
		}
		else
		{
			TIM_Cmd(TIM3,DISABLE);
			flag = 0;
			times = NUM*1000 +TIM_GetCounter(TIM3);
		}
		EXTI_ClearITPendingBit(EXTI_Line6);//清空中断标志位
	}
}

标签:TIM3,循迹,中断,小车,NVIC,TIM,InitStructure,驱动,GPIO
From: https://www.cnblogs.com/luotianwen/p/18031257

相关文章

  • ssts-hospital-web-master项目实战记录十三:项目迁移-架构设计(适配器、设备驱动)
    记录时间:2023-02-24适配器adapter.jsadapter/adapter.ts:全部1.属性 2.函数 2.1.标准适配器 2.2.Ajax操作 adapterPOS.jsadapter-pos.ts:全部1.入口2.属性   3.函数  设备驱动devicedriver.jsdevice-driver/index.ts:全部1.以发卡机为例......
  • appium进行windows桌面应用自动化及启动windows驱动报错解决方案
    安装appium环境参考文档:https://www.cnblogs.com/simon1993/p/16273390.htmlappium安装驱动找到官方驱动安装秘钥http://appium.io/docs/en/latest/ecosystem/drivers/打开cmd执行安装windows驱动命令安装windows驱动windows开发的驱动:https://github.com/Microsoft/WinA......
  • 计算机网络(项目驱动)(微课版)
       主 编:刘春红张同光   出版单位:清华大学出版社   ISBN:   ISBN:   出版时间:2024.7   CIP:   定价:¥ 一本高校计算机专业的网络课程可以选用作为实验教材。一本院校的非计算机专业,二本、高职高专等高校的网络课程都可以直接选用为网络教材使用......
  • 医疗大模型:数据+知识双轮驱动实现医学推理、医患问答、病历自动生成、临床决策,为未来
    医疗大模型:数据+知识双轮驱动实现医学推理、医患问答、病历自动生成、临床决策,为未来医疗服务提供全新可能性1.指令数据集构建目前大多数开源的ChatLLM项目使用的是其他模型(如:ChatGPT)生成的指令数据,其不可避免的存在数据幻想的问题,数据幻想问题将严重影响LLM在实际场景中的应用......
  • LCD液晶超抗干扰段码显示屏驱动芯片VK1C21A/B/C/D/DA/E/EA具备显示效果好,静电耐压高等
    产品型号:VK1C21A/B产品品牌:永嘉微电/VINKA封装形式:SSOP48/LQFP48可定制裸片:DICE(COB邦定片);COG(邦定玻璃用)产品年份:新年份原厂,工程服务,技术支持! 概述:VK1C21A/B是一个点阵式存储映射的LCD驱动器,可支持最大128点(32SEGx4COM)的LCD屏,也支持2COM和3COM的LCD屏。单片机可通过......
  • TDC7200+STM32模拟SPI驱动测量脉冲时差
    TDC7200数据手册:https://www.ti.com/cn/lit/ds/symlink/tdc7200.pdf?ts=1708671736079&ref_url=https%253A%252F%252Fso.szlcsc.com%252FTDC7200硬件电路: TDC7200驱动程序,TDC7200有两种模式,使用的是模式2模拟SPI:SPI写数据:voidSPI_Write_Byte(uint8_tdata){   uint8_t......
  • 迅为RK3568开发板驱动开发指南-输入子系统
     《iTOP-RK3568开发板驱动开发指南》更新,本次更新内容对应的是驱动(第十三篇输入子系统)视频,帮助用户快速入门,大大提升研发速度。 第13篇-输入子系统目录第1篇驱动基础篇第2篇字符设备基础第3篇并发与竞争第4篇高级字符设备进阶第5篇中断第6篇平台总线第7篇设备树......
  • 医疗大模型:数据+知识双轮驱动实现医学推理、医患问答、病历自动生成、临床决策,为未来
    医疗大模型:数据+知识双轮驱动实现医学推理、医患问答、病历自动生成、临床决策,为未来医疗服务提供全新可能性1.指令数据集构建目前大多数开源的ChatLLM项目使用的是其他模型(如:ChatGPT)生成的指令数据,其不可避免的存在数据幻想的问题,数据幻想问题将严重影响LLM在实际场景中的应用......
  • 一款降压恒流内置1.2A 一切二无需切换MOS 外围超简单LED驱动芯片
    产品描述AP2915是一款可以一路灯串切换两路灯串的降压恒流驱动器,高效率、外围简单、内置功率管,适用于5-80V输入的高精度降压LED恒流驱动芯片。内置功率管输出最大功率可达12W,最大电流1.2A。AP2915一路灯亮切换两路灯亮,其中一路灯亮可以全亮,可以半亮。AP2915工作频......
  • LCD液晶超抗干扰段码显示屏驱动芯片VK1C21A/B/C/D/DA/E/EA具备显示效果好,静电耐压高等
    产品型号:VK1C21A/B产品品牌:永嘉微电/VINKA封装形式:SSOP48/LQFP48可定制裸片:DICE(COB邦定片);COG(邦定玻璃用)产品年份:新年份 概述:VK1C21A/B是一个点阵式存储映射的LCD驱动器,可支持最大128点(32SEGx4COM)的LCD屏,也支持2COM和3COM的LCD屏。单片机可通过3/4个通信脚配置显示参数......