stm32驱动超声波模块

发布者:京玩儿最新更新时间:2019-08-19 来源: eefocus关键字:stm32驱动  超声波模块  中断服务 手机看文章 扫描二维码
随时随地手机看文章

#define HCSR04_PORT   GPIOB

#define HCSR04_CLK    RCC_APB2Periph_GPIOB

#define HCSR04_TRIG   GPIO_Pin_8

#define HCSR04_ECHO   GPIO_Pin_9

#define TRIG_Send(n)  do{               

if(n == 0)       

GPIO_ResetBits(HCSR04_PORT,HCSR04_TRIG);

else if(n == 1) 

GPIO_SetBits(HCSR04_PORT,HCSR04_TRIG); 

}while(0) 



#define ECHO_Reci     GPIO_ReadInputDataBit(GPIOB,HCSR04_ECHO)



void UltrasonicInit(void)

{



GPIO_InitTypeDef GPIO_InitStructure;

RCC_APB2PeriphClockCmd(HCSR04_CLK, ENABLE);

 

//IO初始化

GPIO_InitStructure.GPIO_Pin   = HCSR04_TRIG;       //发送电平引脚

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_Out_PP;//推挽输出

GPIO_Init(HCSR04_PORT, &GPIO_InitStructure);

GPIO_ResetBits(HCSR04_PORT,HCSR04_TRIG);

 

GPIO_InitStructure.GPIO_Pin  = HCSR04_ECHO;     //返回电平引脚

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入

GPIO_Init(HCSR04_PORT, &GPIO_InitStructure);  

GPIO_ResetBits(HCSR04_PORT,HCSR04_ECHO);   



TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;     //生成用于定时器设置的结构体

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE);   //使能对应RCC时钟


//配置定时器基础结构体

TIM_DeInit(TIM6);

TIM_TimeBaseStructure.TIM_Period = (1000-1);          //设置在下一个更新事件装入活动的自动重装载寄存器周期的值         计数到1000为1ms

TIM_TimeBaseStructure.TIM_Prescaler =(72-1);          //设置用来作为TIMx时钟频率除数的预分频值  1M的计数频率 1US计数

TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;//不分频

TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式

TIM_TimeBaseInit(TIM6, &TIM_TimeBaseStructure);       //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位         



TIM_ClearFlag(TIM6, TIM_FLAG_Update);                 //清除更新中断,免得一打开中断立即产生中断

TIM_ITConfig(TIM6,TIM_IT_Update,ENABLE);              //打开定时器更新中断

  


NVIC_InitTypeDef NVIC_InitStructure;


NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

NVIC_InitStructure.NVIC_IRQChannel = TIM6_IRQn;            //选择串口1中断

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //抢占式中断优先级设置为1

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;         //响应式中断优先级设置为1

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;            //使能中断

NVIC_Init(&NVIC_InitStructure);


TIM_Cmd(TIM6,DISABLE);

}



//定时器6中断服务程序

u32 msHcCount = 0;

void TIM6_IRQHandler(void)   //TIM6中断

{

if (TIM_GetITStatus(TIM6, TIM_IT_Update) != RESET)  //检查TIM3更新中断发生与否

{

TIM_ClearITPendingBit(TIM6, TIM_IT_Update);       //清除TIMx更新中断标志 

msHcCount++;

}

}



static void OpenTimerForHc()    //打开定时器

{

TIM_SetCounter(TIM6,0);      //清除计数

msHcCount = 0;

TIM_Cmd(TIM6, ENABLE);       //使能TIMx外设

}

 

static void CloseTimerForHc()  //关闭定时器

{

TIM_Cmd(TIM6, DISABLE);      //使能TIMx外设

}



//获取定时器时间

u32 GetEchoTimer(void)

{

u32 t = 0;

t = msHcCount*1000;                  //将MS转换成US

t += TIM_GetCounter(TIM6);           //得到总的US

TIM6->CNT = 0;                       //将TIM6计数寄存器的计数值清零

return t;

}



//一次获取超声波测距数据 两次测距之间需要相隔一段时间,隔断回响信号

//为了消除余震的影响,取五次数据的平均值进行加权滤波。

float Hcsr04GetLength(void )

{


u32 t = 0;

int i = 0;

float lengthTemp = 0;

float sum = 0;



while(i!=5)

{

/*发送一个20ms的脉冲*/

TRIG_Send(1);             

osDelay(20);

TRIG_Send(0);


while(ECHO_Reci == 0);     //等待接收口高电平输出(超声波发出)

OpenTimerForHc();          //打开定时器

while(ECHO_Reci == 1);     //等待超声波返回

CloseTimerForHc();         //关闭定时器

t = GetEchoTimer();        //获取时间,分辨率为1US

lengthTemp = ((float)t*17/1000.0);//cm

sum = lengthTemp + sum ;

 i = i + 1;

  }


lengthTemp = sum/5.0;

return lengthTemp;



}


关键字:stm32驱动  超声波模块  中断服务 引用地址:stm32驱动超声波模块

上一篇:STM32单片机连接HC_SR04超声波模块测距
下一篇:基于STM32F103循迹小车

推荐阅读最新更新时间:2024-11-09 19:56

GP2Y10驱动含PM2.5和AQI(STM32
一、前期准备 单片机:STM32F103ZET6 开发环境:MDK5.14 库函数:标准库V3.5 GP2Y10模块:淘宝有售 二、实验效果 三、驱动原理 主要就是采集AD电压,对应转换公式做相关的转换。 需要完整工程或者有问题的请加QQ:1002521871,验证:呵呵。 四、驱动代码 gp2y10.h #ifndef __GP2Y10_H__ #define __GP2Y10_H__ #include stm32f10x.h #include gpio.h #include delay.h #include uart.h #define GP2Y10_CONTROL PAout(0) #defin
[单片机]
GP2Y10<font color='red'>驱动</font>含PM2.5和AQI(<font color='red'>STM32</font>)
STM32下DS18B20的驱动
折腾了一晚上,才把DS18B20的驱动移植到STM32上来。以前在51上使用过单个和多个连接的DS18B20,有现成的程序了,以为很快就能弄好,结果还是被卡住了,下面说下几个关键点吧: 首先是延时的问题,STM32上若用软件延时的话不太好算时间,所以要么用定时器要么用SysTick这个定时器来完成延时的计算。相比之下用SysTick来的简单方便点。 接着是STM32 IO脚的配置问题,因为51是双向的IO,所以作为输入输出都比较方便。STM32的IO是准双向的IO,网上查了下资料,说将STM32的IO配置成开漏输出,然后外接上拉即可实现双向IO。于是我也按规定做了,但调了老半天都不成功,是因为DS18B20没有响应的信号。
[单片机]
使用STM32实现PMSM电机的正弦驱动
Microchip 的应用笔记 AN1017 讲述了一种使用空间矢量调制(Space Vector Modulation,SVM)方法产生用于驱动 PMSM 电机各相的正弦电流,以此驱动具有霍尔位置传感器的永磁同步电机(Permanent Magnet Synchronous Motor,PMSM)的控制算法,其配套的开源算法采用 dsPIC® 数字信号控制器实现,此前在淘宝购入了一块基于 STM32 的无刷直流电机开发板,于是试着将该开源代码移植至手上这块开发板上。开发板如下图所示: 中断服务程序一览表 中断 何时调用 执行操作 TIM1 20kHz 根据当前位置使用 SVM 产生正弦波 TIM2 1kH
[单片机]
使用<font color='red'>STM32</font>实现PMSM电机的正弦<font color='red'>驱动</font>
基于stm32f10x的超声波模块HC-SR04的测距示例
一.所需材料: 1任何一种型号的stm32f10x的微控制器 2.HC-SR04模块 3.安装串口驱动与串口助手(这里用的火哥的串口调试助手) 4.ST-link或者串口等下载方式都可以 二。超声波原理 网上一大堆,这里我就大体说一下:单片机先给TRIG一个大于10us的高电平,然后模块ECHO引脚会发出一个高电平,检测高电平的时间乘声速便可算出距离。这里ECHO发出也接收,所以检测的时间,假设按秒算,然后乘170便是以m为单位的距离。 三.源代码分析 1.接口定义: //由于只是用的定时器的基本计时功能,所以IO口随便找两个便可以 #define HCSR04_PORT GPIOB
[单片机]
基于stm32f10x的<font color='red'>超声波</font><font color='red'>模块</font>HC-SR04的测距示例
STM32硬件SPI驱动0.96寸的OLED
1.OLED相关 参见—- 51 软件模拟SPI驱动OLED 2.硬件SPI 参见—- SPI专题(二)——STM32驱动FLASH(W25Q64) 3.驱动程序 驱动程序参照51单片机进行移植,只不过模拟的SPI换成STM32硬件SPI,不用再写时序部分的代码。对于STM32的硬件SPI,我们在驱动FLASH中已有介绍,这里就不再做介绍。 OLED引脚部分定义: #ifndef __OLED_H #define __OLED_H #include spi.h #include stm32f10x.h #include stm32f10x_conf.h #define Max_Column
[单片机]
stm32 中断服务函数是如何进入的
今天在看stm32的中断,一时间不理解stm32主函数是如何进入中断函数的,按C编程的理解,会有个特定的入口之类的,但是看demo过程中没有发现入口。 以串口中断服务函数void USART1_IRQHandler(void) 为例,首先用到串口中断,需要先设定串口中断初始化以及串口初始化,另外void USART1_IRQHandler(void) 中断服务函数也应该写好。 发现在stm32的启动文件startup_stm32f10x_md.s中写到 DCD USART1_IRQHandler 其中DCD是一条数据定义伪指令,用于分配一片连续的字存储单元并用指定的数据初始化。 库里定义 #define USART1 ((
[单片机]
STM32的硬件SPI驱动LCD例子
前言:每学一个新知识,都会出现很多出错的情况,百度也查不出来,耗费很多时间,主要是不理解底层原理,没太多时间去理解,催得紧。SPI嘛,是人都知道干嘛用的,我一时半会也不知道怎么表达,百度最不缺的就是定义。缺的是实现过程,本少爷花了几十个积分搞了n多个实例,终于总结了要成功实现SPI要哪些奇葩的步骤。 历史:今天17年9月1,前几天我导师嫌我刷新屏幕太慢,给我做了代码的调整,发现速度杠杠的,屏幕蹭蹭蹭的刷屏,翻一下笔记,大概要处理几处小细节:1.LCD的CS片选做优化 2.DC也优化3.直接操作寄存器4.我下文中加了Delay(1);后来也优化了。有时间另写优化的链接给大家 正文: -----------------------
[单片机]
stm32驱动LCD
(1)头文件的编写方法 示例:// 头文件 file.h #ifndef FILE_H //FILE_H 可以随便写,只是一个标号是为了防止头文件重复定义 #define FILE_H //要和上面的这个一样, void fun(); void fun1(); void fun2(); void fun3(); .......... .......... #endif
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved