打印
[STM32F0]

游名:STM32F030+FT1610FF1高精度超声波测距模块测距教程及参...

[复制链接]
5087|114
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 mmuuss586 于 2020-7-19 21:46 编辑

基于STM32F030+FT1610FF1高精度超声波测距模块测距教程及参考程序等开源分享
资料下载见附件,电脑登入
微信公众号:游名开源
硬件说明:
    2脚、3脚:需要接4.7到10K上拉电阻到3.3V或5V电源  
特性:  
极简的设计;
极轻的重量;
极高的测量灵敏度;
极低的消耗电流;
接口ESD保护;
偏捷的安装及使用方式;
有效测量距离3cm-1.5m(其它距离范围可定制);
支持3到5V宽电压,默认采用IO通信方式(默认IO通讯),接口兼容IIC、UART通信、485通信;


基于STM32F030+FT1610FF1高精度超声波测距模块测距教程.pdf

416.85 KB

Ultrasonic(Program).zip

20.99 MB

FT1610FF1超声波测距模块产品规格书V2.0.pdf

1.09 MB

使用特权

评论回复
评论
tangzw688 2020-11-10 14:41 回复TA
受教了 
沙发
mmuuss586|  楼主 | 2020-3-6 15:58 | 只看该作者
本帖最后由 mmuuss586 于 2020-7-27 12:49 编辑



5.png (106.77 KB )

5.png

4.png (143.44 KB )

4.png

3.png (107.97 KB )

3.png

2.png (483.81 KB )

2.png

游名科技产品目录(2020-7-21).pdf

1.05 MB

使用特权

评论回复
板凳
mmuuss586|  楼主 | 2020-3-6 15:59 | 只看该作者

基于STM32F030+FT1610FF1高精度超声波测距模块测距教程

      学习板卡需求:官方NUCLEO-F030R8或自制NUCLEO-DG板卡和FT1610FF1超声波,杜邦线4根;板卡连接如图:


使用特权

评论回复
地板
mmuuss586|  楼主 | 2020-3-6 15:59 | 只看该作者
配置和连接方式
                NUC_LEO-DG-------------- FT1610FF1
                        PB3------------------------------T/SDA/TX
                        PB5------------------------------E/SCL/RX
                        5V/3V----------------------------VCC
                        GND-----------------------------GND

使用特权

评论回复
5
mmuuss586|  楼主 | 2020-3-6 16:01 | 只看该作者

USART2串口通信引脚PA2、PA3和LED2的指示灯引脚PA5,基本的Cube配置不做介绍,主要为我们需要通过PB5读取IO的高电平持续时间,这里用到的是定时器的输入捕获功能,具体的Cube配置如下图所示:



使用特权

评论回复
6
mmuuss586|  楼主 | 2020-3-6 16:01 | 只看该作者
然后再NVICSetings中选上TIM3 global interrupt,入下图:



1.png (21.24 KB )

1.png

使用特权

评论回复
7
mmuuss586|  楼主 | 2020-3-6 16:02 | 只看该作者
然后把串口和LED输出配置好后生成MDK代码,编译无错误后添加需要的相关代码,主要缺少的代码为TIM3输入捕获的中断服务函数和串口通信的重定向函数,这里需要添加两个对应的全局变量,代码如下:
全局变量:
uint8_t  TIM3CH2_CAPTURE_STA=0;                               
uint32_t        TIM3CH2_CAPTURE_VAL;

使用特权

评论回复
8
mmuuss586|  楼主 | 2020-3-6 16:03 | 只看该作者
中断服务函数:
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{

    if((TIM3CH2_CAPTURE_STA&0X80)==0)
    {
            if(TIM3CH2_CAPTURE_STA&0X40)
            {
                if((TIM3CH2_CAPTURE_STA&0X3F)==0X3F)
                {
                    TIM3CH2_CAPTURE_STA|=0X80;     
                    TIM3CH2_CAPTURE_VAL=0XFFFF;
                }
                else TIM3CH2_CAPTURE_STA++;
            }   
    }      
}

使用特权

评论回复
9
mmuuss586|  楼主 | 2020-3-6 16:03 | 只看该作者
//定时器输入捕获中断处理回调函数,该函数在HAL_TIM_IRQHandler中会被调用
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
    if((TIM3CH2_CAPTURE_STA&0X80)==0)
    {
        if(TIM3CH2_CAPTURE_STA&0X40)           
            {               
                TIM3CH2_CAPTURE_STA|=0X80;     
                TIM3CH2_CAPTURE_VAL=HAL_TIM_ReadCapturedValue(&htim3,TIM_CHANNEL_2);
                long long temp=0;
                                                                float distance=0.0;
                temp=TIM3CH2_CAPTURE_STA&0X3F;
                temp*=0XFFFF;              
                temp+=TIM3CH2_CAPTURE_VAL;   
                temp=(temp*100)/58;
                                                                distance=(float)temp/100;
                printf("Goal distence:%.2lf cm\r\n",distance);
                __HAL_TIM_DISABLE(&htim3);      
            }
        else                              
            {
                TIM3CH2_CAPTURE_STA=0;         
                TIM3CH2_CAPTURE_VAL=0;
                TIM3CH2_CAPTURE_STA|=0X40;   
                __HAL_TIM_DISABLE(&htim3);      
                __HAL_TIM_SET_COUNTER(&htim3,0);
                TIM_RESET_CAPTUREPOLARITY(&htim3,TIM_CHANNEL_2);  
                TIM_SET_CAPTUREPOLARITY(&htim3,TIM_CHANNEL_2, TIM_ICPOLARITY_FALLING);         
                                                }      
                        }
}

使用特权

评论回复
10
mmuuss586|  楼主 | 2020-3-6 16:03 | 只看该作者
串口重定向函数为(需要包含对应的stdio.h头文件)
int fputc(int ch,FILE *f)
{
        while(0==(USART2->ISR&0x40));
        USART2->TDR=ch;
        return ch;
       
}

使用特权

评论回复
11
mmuuss586|  楼主 | 2020-3-6 16:04 | 只看该作者
然后在main函数中添加定时器中断使能和捕获使能函数,及测试需要的功能代码,main函数如下
int main(void)
{

  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  MX_DMA_Init();
  MX_USART2_UART_Init();
  MX_TIM3_Init();
  /* USER CODE BEGIN 2 */
        __HAL_TIM_ENABLE_IT(&htim3,TIM_IT_UPDATE);
        HAL_TIM_IC_Start_IT(&htim3,TIM_CHANNEL_2);
  while (1)
  {
                Measure_Start();
                 if(TIM3CH2_CAPTURE_STA&0X80)        
                {
                                __HAL_TIM_SET_COUNTER(&htim3,0);
                                TIM_RESET_CAPTUREPOLARITY(&htim3,TIM_CHANNEL_2);
                                TIM_SET_CAPTUREPOLARITY(&htim3,TIM_CHANNEL_2,TIM_ICPOLARITY_RISING);
                                __HAL_TIM_ENABLE(&htim3);
                                TIM3CH2_CAPTURE_STA=0;
                }
                HAL_GPIO_TogglePin(LD2_GPIO_Port,LD2_Pin);
                HAL_Delay(1000);

  }
}

使用特权

评论回复
12
mmuuss586|  楼主 | 2020-3-6 16:04 | 只看该作者
其中Measur_Start()函数为触发超声波模块测量开始的TTL信号,代码如下
void Measure_Start(void)
{
        HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3, GPIO_PIN_SET);
                HAL_Delay(1);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3, GPIO_PIN_RESET);
}

使用特权

评论回复
13
mmuuss586|  楼主 | 2020-3-6 16:05 | 只看该作者

这一部分参照模块IO通信模式的时序图可知,模块通信模式设置如下图:


使用特权

评论回复
14
mmuuss586|  楼主 | 2020-3-6 16:06 | 只看该作者
代码添加后,烧录到板卡,然后打开串口通信助手,打开串口后就可以看到模块测试的数据如下图


使用特权

评论回复
15
mmuuss586|  楼主 | 2020-3-6 16:06 | 只看该作者
[em:2:]

使用特权

评论回复
16
mmuuss586|  楼主 | 2020-3-6 21:06 | 只看该作者

使用特权

评论回复
17
lihuami| | 2020-3-6 21:18 | 只看该作者

使用特权

评论回复
18
mmuuss586|  楼主 | 2020-3-7 21:17 | 只看该作者

使用特权

评论回复
19
liuchangyin| | 2020-3-7 22:48 | 只看该作者
给你点赞

使用特权

评论回复
20
mmuuss586|  楼主 | 2020-3-8 19:20 | 只看该作者

感谢支持

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:欢迎进入21IC论坛 游名科技:提供直流无刷电机驱动整体解决方案

696

主题

32677

帖子

441

粉丝