完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
电子发烧友论坛|
|
|
相关推荐
1个回答
|
|
|
调试超声波传感器时候,最先使用的是中断来判断是方法配置成功,结果一直报错,才发现是忘记添加中断配置库文件了…愚人节快乐…具体内容明天补充
其实,超声波传感器工作原理很简单,但是要想高精度、连续不断的快速实现距离测量还是很有难度的。 当然,STM32也是这样,配置PWM体会最为深刻,实现一个功能很简单,但是效率如何呢?PWM的脉宽、周期准不准确,差了几毫秒或者几微妙是为什么,还能改善么?串口通信很简单,那么串口如何连续不断的接收数据又该如何处理呢?(建立串口缓冲区) STM32的启动文件是如何的,.S文件中的具体启动流程如何,在一个简单的程序中各个寄存器是如何工作的呢/ 技术路漫漫,希望自己能够不断思考,质疑… 此外,在硬件编程中,要定义变量时候要注意使用volatitle,比如在此次超声波代码处理过程中,有些变量就没能更新。 1、PWM脉冲捕获 STM32 的定时器功能十分强大,有 TIME1 和 TIME8 高级定时器,也有 TIME2~TIME5 通用定时器,还有 TIME6 和TIME7 基本定时器。 1.1 STM32 高级定时器简介 参考[4] STM32 高级定时器 1.2 STM32 通用定时器简介 STM32 的通用定时器是一个通过可编程预分频器(PSC)驱动的 16 位自动装载计数器(CNT)构成。STM32 的通用定时器可以被用于:测量输入信号的脉冲长度(PWM输入捕获)或者产生输出波形(输出比较和 PWM)等。STM32 的每个通用定时器都是完全独立的,没有互相共享的任何资源。 STM32 的通用定时器 TIMx (TIM2、TIM3、TIM4 和 TIM5) 功能包括:
[5] STM32 基本定时器 1.2 何为捕捉PWM脉冲 通过检测输入的PWM脉冲信号,获取该脉冲的占空比,频率等关键信息。 1.3 如何捕捉PWM脉冲 首先通过STMPA7引脚输出PWM脉冲:STM32配置多个外部中断 通过检测引脚状态,控制相应计数器的开启与关闭来实现PWM脉冲高低电平的计数,再通过计数器的周期计算出相应PWM的高低电平时间,进而得到PWM的周期和占空比。 对于周期比较小的PWM脉冲,可以不适用计数器中断就可以实现脉冲时间的测量,但是由于计数器单次计数周期较大而导致最终测量结果误差较大。提高测量精度就需要降低单次计数周期,但是这样无法测量周期较大的PWM脉冲。此时就需要引入计数器中断来实现PWM脉冲时间的精准测量。 PWM脉冲测量代码案例: (没有使用计数器中断) /* * 检测高低电平时间,返回值单位是ms, * 函数参数flag = 0:低电平时间;flag= 1:高电平时间 */ float getH_L(u8 flag){ u8 i; float timecount[5]; for(i = 0;i<5;i++){ TIM4->CNT=0; //TIM3的计数器清零 if(flag){ while( GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_8) == 0); //打开定时器 TIM_Cmd(TIM4,ENABLE); while( GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_8) == 1); //关闭定时器 TIM_Cmd(TIM4,DISABLE); timecount = TIM4->CNT * 0.001*0.125; } else{ while( GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_8) == 1); //打开定时器 TIM_Cmd(TIM4,ENABLE); while( GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_8) == 0); //关闭定时器 TIM_Cmd(TIM4,DISABLE); timecount = TIM4->CNT * 0.001*0.125;//此处0.125是根据TIM4的配置时钟来的 } } return (timecount[1]+timecount[2]+timecount[3]+timecount[4]+timecount[0])/5; } int main() { SysTick_Init(); USART1_Config(); SRF05_Config(); TIME2_Config(); TIME3_Config(); TIME4_Config(); GPIO_WriteBit(GPIOA,SRF05_Trig,Bit_RESET); while(1){ printf("high time = %f msrn",getH_L(1)); printf("low time = %f msrn",getH_L(0)); printf("PWM period = %f msrn",getH_L(1)+getH_L(0)); printf("PWM Dutyfactor = %f rn",getH_L(1)/(getH_L(1)+getH_L(0))); } } PWM生成仿真: 低电平时间:0.889472ms 高电平时间:0.120806ms PWM测量结果:精度还是很高的 Q:一旦在主函数while(1)循环中添加延时函数,测量结果就会有较大的偏差,这是为什么? 2、超声波传感器 HY-SRF05超声波传感器测距模块可提供2cm-450cm的非接触距离感测功能,测距精度可达到3mm;模块包括超声波发生器、接收器与控制电路。 引脚定义: [tr]引脚作用[/tr]
2.1 超声波传感器工作原理 以上时序图表明你只需要提供一个 10uS以上脉冲触发信号,该模块内部将 发出8个 40kHz周期电平并检测回波。一旦检测到有回波信号则输出回响信号。 回响信号的脉冲宽度与所测的距离成正比。 由此通过发射信号到收到的回响信号时间间隔可以计算得到距离。 公式: 距离= 高电平时间*声速( 340M/S) /2 注意:
float getdistance(void){ float SendBuff2 = 0,ans[Nnum]={0}; int timecount; u8 i; GPIO_WriteBit(GPIOA,SRF05_Trig,Bit_RESET); for(i = 0;i < Nnum;i++){ GPIO_WriteBit(GPIOA,SRF05_Trig,Bit_SET); delay_us(30); GPIO_WriteBit(GPIOA,SRF05_Trig,Bit_RESET); TIM2->CNT=0; //TIM3的计数器清零 while( GPIO_ReadInputDataBit(SRF05_PORT, SRF05_Echo) == 0); //打开定时器 TIM_Cmd(TIM2,ENABLE); while( GPIO_ReadInputDataBit(SRF05_PORT, SRF05_Echo) == 1); // //关闭定时器 TIM_Cmd(TIM2,DISABLE); timecount = TIM2->CNT; ans = timecount*0.0001*344/2; delay_ms(100); } Sort_tab(ans,Nnum);//冒泡排序 /* 累加 N - Xnum 个 ADC 采样 */ for (i = Xnum/2; i < Nnum-Xnum/2; ++i) { SendBuff2 += ans; } SendBuff2 /= Nnum - Xnum; return SendBuff2; } |
|
|
|
|
只有小组成员才能发言,加入小组>>
1634 浏览 0 评论
imx6ull 和 lan8742 工作起来不正常, ping 老是丢包
4741 浏览 0 评论
4231 浏览 9 评论
3824 浏览 16 评论
4400 浏览 1 评论
4213浏览 3评论
2381浏览 0评论
3394浏览 0评论
1159浏览 0评论
2844浏览 0评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-2 12:58 , Processed in 0.619310 second(s), Total 74, Slave 54 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
18492