欢迎光临
我们一直在努力

【stm32】之超声波测距实验和从模式控制的含义

1.超声波测距

①测距传感器介绍:HC_SR04。

四个引脚,Vcc,Gnd,Trig,Echo。

Trig负责发送一个不低于10us的脉冲信号,唤醒传感器发送超声波来测距。

Echo引脚在接收到返回的波形时会输出低电平。

想要知道测距原理,就要知道测距与Echo引脚上的脉冲信号的脉宽有关。我们要想办法求得脉冲宽度。因此要捕获到上升沿和下降沿,那么显而易见,我们应该利用定时器的输入捕获功能。Echo引脚与CH1相连,也就是把Echo上的信号送入通道一,进行滤波,筛选边沿,分别得到TI1FP1(捕获上升沿),TI1FP2(间接捕获下降沿)这两个信号,然后走分频器,在上升沿和下降沿到来时,捕获寄存器CC1和CC2就会分别将此时的CNT值拍照存入CC1和CC2中,那么脉冲宽度就是CC2-CC1

②实验目标  利用HC_SR04模块测量传感器到障碍物的距离,后通过串口模块向电脑发送此时测得的距离。

③工作情景  Trig引脚发送一个脉冲唤醒信号,于是传感器的两个像“眼睛”一样的部分开始“工作”了。左侧的“眼睛”发送八段脉冲高低电平信号,也就是像空气中发出超声波,遇到障碍物后会自动反射回来。右侧“眼睛”接受反射回来的超声波,也表示为八段高低电平信号。那另一个Echo引脚呢?它在传感器发送完超声波的时候,把自己拉成高电平。在接受完八段反射回来的声波后,把自己拉成低电平。此时Echo引脚上就会出现一个明显的脉冲信号,此脉冲信号的脉宽就是声波在空气中传播的时间!又因为是来回的过程,故传感器到障碍物的距离=(时间*340m/s)/2;

④要用到的模块   定时器以及输入捕获功能,串口,超声波传感器模块。

⑤代码思路    首先,我们要用串口收发功能,就要初始化串口模块。其次,要把整个测距功能封装起来,就要初始化Trig,Echo引脚,初始化时基单元(为整个程序启动计时时钟)。对了,这里我还要强调!我今天突然悟出来,时基单元存在的意义就是为这个程序启动一个闹钟,只要程序开始运行,实际单元里的CNT会不断计时,达到设定的ARR值后溢出,因此它就相当于一个闹钟!还要初始化输入捕获通道。准备工作都做好了,接下来就是进入测距阶段。

串口初始化步骤:1.初始化TX,RX引脚。(PA9,PA10)2.打开串口时钟  3.初始化UASART模块(参数:USART_Baud_Rate波特率,USART_HardWareControl硬件流控,USART_Mode方式,USART_Parity校验方式,USART_StopBits停止位长度,UASART_WordLength数据长度)4.闭合总开关。

定时器初始化步骤:1.初始化时基单元。(参数:TIM_CounterMode计数模式,TIM_Prescaler预分频值,TIM_Period周期,TIM_RepetitionCounter重复计数器,开启预分频器ARR,CRR,闭合定时器开关,但开关在测距阶段才会打开)2.初始化输入捕获通道。(TIM_Channel通道,TIM_ICFilter滤波,TIM_ICPolarity极性,TIM_ICSelection模式选择,TIM_ICPrescaler分频)

测距步骤:1.清空所有CC1,CC2,CNT的值。2.开启定时器。3.给Trig引脚一个脉冲信号4.等待CC1和CC2捕获上升沿下降沿。5.关闭定时器。

注意事项:至于为什么Echo引脚(即定时器通道1的引脚PA8)要设置成输入下拉模式,因为Echo引脚若出现低电平,代表空闲状态,若出现高电平,则代表工作,因此设置成输入下拉模式,就是因为若引脚意外断开,下拉电阻会让Echo输出默认的低电压,即表示空闲状态,这样可以使意外对程序的影响最小化。

代码:  

#include "stm32f10x.h"                  // Device header
#include "Delay.h"

void APP_USART_Init(void)
{
//1.初始化TX,RX引脚 TX-PA8 AF_PP RX-PA10 IPU
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP;
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_8;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_10MHz;
GPIO_Init(GPIOA,&GPIO_InitStruct);
    
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IPU;
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_10;
GPIO_Init(GPIOA,&GPIO_InitStruct);

//2.开启USART时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
    
//3.初始化USART模块
USART_InitTypeDef USART_InitStruct;
USART_InitStruct.USART_BaudRate=115200;
USART_InitStruct.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
USART_InitStruct.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;
USART_InitStruct.USART_Parity=USART_Parity_No;
USART_InitStruct.USART_StopBits=USART_StopBits_1;
USART_InitStruct.USART_WordLength=USART_WordLength_8b;
USART_Init(USART1,&USART_InitStruct);

//4.闭合总开关
USART_Cmd(USART1,ENABLE);
}

void  APP_HCSR04_Init(void)
{
//1.初始化Trig引脚和Echo引脚 Trig-PA0   Echo-A8-IPD
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GPIO_InitTypeDef GPIO_InitStruct;    
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_0;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_2MHz;
GPIO_Init(GPIOA,&GPIO_InitStruct);
    
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IPD;
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_8;
GPIO_Init(GPIOA,&GPIO_InitStruct);

//2.初始化定时器时基单元
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct={0};
TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up;
TIM_TimeBaseInitStruct.TIM_Period=65535;//ARR
TIM_TimeBaseInitStruct.TIM_Prescaler=71;//预分频
TIM_TimeBaseInitStruct.TIM_RepetitionCounter=0;//RCR
TIM_TimeBaseInit(TIM1,&TIM_TimeBaseInitStruct);
    
//2.初始化输入比较通道
//2.1通道1捕获上升沿,通道2捕获下降沿
TIM_ICInitTypeDef TIM_ICInitStruct={0};
TIM_ICInitStruct.TIM_Channel=TIM_Channel_1;
TIM_ICInitStruct.TIM_ICFilter=0;
TIM_ICInitStruct.TIM_ICPolarity=TIM_ICPolarity_Rising;
TIM_ICInitStruct.TIM_ICPrescaler=TIM_ICPSC_DIV1;
TIM_ICInitStruct.TIM_ICSelection=TIM_ICSelection_DirectTI;
TIM_ICInit(TIM1,&TIM_ICInitStruct);

TIM_ICInitStruct.TIM_Channel=TIM_Channel_2;
TIM_ICInitStruct.TIM_ICFilter=0;
TIM_ICInitStruct.TIM_ICPolarity=TIM_ICPolarity_Rising;
TIM_ICInitStruct.TIM_ICPrescaler=TIM_ICPSC_DIV1;
TIM_ICInitStruct.TIM_ICSelection=TIM_ICSelection_IndirectTI;
TIM_ICInit(TIM1,&TIM_ICInitStruct);
}

int main()
{   
    APP_HCSR04_Init();
    APP_USART_Init();
    while(1)
    {   
    //1.清空CCR1,CCR2,CNT
    TIM_SetCounter(TIM1,0);
    TIM_ClearFlag(TIM1,TIM_FLAG_CC1);
    TIM_ClearFlag(TIM1,TIM_FLAG_CC2);
    //2.开启定时器时钟
    TIM_Cmd(TIM1,ENABLE);
    //3.向Trig引脚发送一个脉冲信号
    GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_RESET);Delay_us(10);
    //4.等待CC1和CC2
    while(TIM_GetFlagStatus(TIM1,TIM_FLAG_CC1)==RESET);
    while(TIM_GetFlagStatus(TIM1,TIM_FLAG_CC2)==RESET);
    //5.闭合开关
    TIM_Cmd(TIM1,DISABLE);    
    }
}

2.从模式控制器

定时器的时基单元就是用来产生那个CNT一直自增又回来的阶梯波形。一闭合他的开关,他就开始从零计数了,就是一个阶梯状的波形图。从模式控制就是为了控制这个小玩意的。如果时基单元作为被控制器,你先选择八种从模式。通过TRGI口输入不同的信号,控制时基单元的通断,或者时基单元中的参数。就会造成那个波形一会儿平,一会儿又递增的。

而且8种从模式,为啥叫从模式呢?因为对于时基单元而言,它现在是“从”,被控制的关系,设置不同的模式,再通过TRGI输入不同的信号,就能控制那个时基单元变换不停。而反过来也有8种主模式,但是我们只考虑两种主模式。为啥叫主?因为此刻时基单元是主人。比如Update模式,时基单元里每次隔1ms产生1个更新事件,则TRGO就每隔1ms产生一个脉冲,是TRGO根据不同的主模式,看时基单元的脸色去产生不同信号。

八种从模式:

1.从模式禁止:不通过TRGI接受控制信号 

2.编码器模式1:与编码器有关

3.编码器模式2:与编码器有关

4.编码器模式3:与编码器有关

5.复位模式:TRGI上升沿对CNT清零

6.门模式:TRGI=高,总开关闭合;TRGI=低,总开关断开

7.触发模式:TRGI上升沿闭合总开关

8.外部时钟模式1:TRGI作为时基单元的时钟来源

重要的主模式:

2.使能:总开关闭合,TRGO=1,反之TRGO=0;

3.Updata:每个Updata事件,TRGO输出脉冲。

定时器同时启停的例子:

想让TIM1,TIM2,TIM3同时启停。

可将TIM1的TRGO设置为使能模式,根据时基单元的开关来控制TRGO输出高低电平。同时将TIM2和TIM3的TRGI设置成门模式,当TRGO输出1,TIM2和TIM3开关闭合,反之断开。

定时器级联例子:

TIM1-秒针 TIM2-分针 TIM3-时针

加入TIM1的频率为1kHZ,进行1k分频,得到频率为1HZ,即CNT每秒加1,ARR设为59,每一分钟溢出一次,RCR设为0,则1分钟产生一个Update模式。将TIM1设为Updata模式,每来一个Update,TRGO就输出一个脉冲信号。将TIM2的TRGI设为外部时钟模式1,每一分钟TRGO来一个脉冲,再给TIM2的TRGI,于是TIM2的CNT就加1,就相当于分针每分钟加1,且TIM2的ARR也为59,相当于TIM2每小时溢出一次。同理,TIM3的TRGI与TIM2的TRGI相连,TRGI每一小时来一次脉冲,则TIM3的CNT每一小时加一,TIM的ARR为23,则每24小时溢出一次。

3.用从模式控制器测量PWM信号参数原理

据图观察,ITR0-ITR3代表其他定时器来的TRGO信号,用于定时器的级联。对于不同的定时器,ITR0-ITR3代表的含义不一样。这个表格的意义是:左侧代表要级联的定时器,右边代表主定时器。ITR0~3代表不同的主定时器的TRGO引脚输出的信号。

测量PWM参数原理

PWM信号输入到CH1,分别得到TI1FP1,TI1FP2,把TI1FP1作为TRGI的信号来源,当PWM信号出现上升沿,TI1FP1出现一个脉冲(也会存在一个上升沿),把TRGI设为复位模式。当TRGI出现上升沿,会对计数器CNT清零,每出现一个上升沿,计数器CNT都被清零。与此同时TI1FP2会继续走输入捕获通道,捕获到下降沿后会把CNT值拍照存进CCR2中。那么CCR2就是高电压所占时间,下一次的CCR1值就是整个周期所占时间。

赞(0)
未经允许不得转载:171主机测评 » 【stm32】之超声波测距实验和从模式控制的含义
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址