找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1468|回复: 0
打印 上一主题 下一主题
收起左侧

单一US-015避障模块,小车避障STM32程序

[复制链接]
跳转到指定楼层
楼主
ID:690596 发表于 2020-2-6 18:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
实验器材:
        NANO STM32F103开发板V1版本,US-015避障模块
        
实验目的:
        超声波避障测试程序
        
硬件资源:
        1.Trig连接PA8
        2.Echo连接PC8
        
实验现象:
        本实验利用PA8产生20us高电平触发信号,周期10ms;
              利用TIM3_CH3来做输入捕获,我们将捕获PC8上的高电平脉宽,并将脉宽时间通过串
              口打印出来,
        
注意事项:
        硬件连接在电源关闭的状态下进行.  
                **编程时PC8底层程序要使能其复用功能。
#include "us015timer.h"
//  PC8---Echo     TIM3 CH3


//TIM3  捕获初始化
TIM_HandleTypeDef TIM33_Handler;         //定时器3句柄

//定时器2通道1输入捕获配置
//arr:自动重装值(TIM3是16位的!!)
//psc:时钟预分频数
void TIM3_CH3_Cap_Init(u32 arr,u16 psc)
{  
    TIM_IC_InitTypeDef TIM3_CH3Config;  

    TIM33_Handler.Instance=TIM3;                          //通用定时器3
    TIM33_Handler.Init.Prescaler=psc;                     //分频系数
    TIM33_Handler.Init.CounterMode=TIM_COUNTERMODE_UP;    //向上计数器
    TIM33_Handler.Init.Period=arr;                        //自动装载值
    TIM33_Handler.Init.ClockDivision=TIM_CLOCKDIVISION_DIV1;//时钟分频因子
        TIM33_Handler.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;//使能自动重载
    HAL_TIM_IC_Init(&TIM33_Handler);                                                //初始化输入捕获时基参数

    TIM3_CH3Config.ICPolarity=TIM_ICPOLARITY_RISING;    //上升沿捕获
    TIM3_CH3Config.ICSelection=TIM_ICSELECTION_DIRECTTI;//映射到TI1上
    TIM3_CH3Config.ICPrescaler=TIM_ICPSC_DIV1;          //配置输入分频,不分频
    TIM3_CH3Config.ICFilter=0;                          //配置输入滤波器,不滤波
    HAL_TIM_IC_ConfigChannel(&TIM33_Handler,&TIM3_CH3Config,TIM_CHANNEL_3);//配置TIM3通道3
        
    HAL_TIM_IC_Start_IT(&TIM33_Handler,TIM_CHANNEL_3);   //开启TIM3的捕获通道3,并且开启捕获中断
    __HAL_TIM_ENABLE_IT(&TIM33_Handler,TIM_IT_UPDATE);   //使能更新中断
        
        HAL_NVIC_SetPriority(TIM3_IRQn,2,0);    //设置中断优先级,抢占优先级2,子优先级0
    HAL_NVIC_EnableIRQ(TIM3_IRQn);          //开启ITM3中断通道  
}

//定时器2底层驱动,时钟使能,引脚配置
//此函数会被HAL_TIM_IC_Init()调用
//htim:定时器2句柄
void HAL_TIM_IC_MspInit(TIM_HandleTypeDef *htim)
{
    GPIO_InitTypeDef GPIO_Initure;
    __HAL_RCC_TIM3_CLK_ENABLE();            //使能TIM3时钟
    __HAL_AFIO_REMAP_TIM3_ENABLE();        
        __HAL_RCC_GPIOC_CLK_ENABLE();                        //开启GPIOC时钟
        
    GPIO_Initure.Pin=GPIO_PIN_8;            //PC8
    GPIO_Initure.Mode=GPIO_MODE_AF_INPUT;         //复用推挽输入
    GPIO_Initure.Pull=GPIO_PULLDOWN;        //下拉
    GPIO_Initure.Speed=GPIO_SPEED_HIGH;     //高速
    HAL_GPIO_Init(GPIOC,&GPIO_Initure);

    HAL_NVIC_SetPriority(TIM3_IRQn,2,0);    //设置中断优先级,抢占优先级2,子优先级0
    HAL_NVIC_EnableIRQ(TIM3_IRQn);          //开启ITM3中断通道  
}

//捕获状态
//[7]:0,没有成功的捕获;1,成功捕获到一次.
//[6]:0,还没捕获到低电平;1,已经捕获到低电平了.
//[5:0]:捕获低电平后溢出的次数
u8  TIM3CH3_CAPTURE_STA=0;                                                        //输入捕获状态                                                   
u16        TIM3CH3_CAPTURE_VAL;                                                          //输入捕获值(TIM3是16位)

//定时器2中断服务函数
void TIM3_IRQHandler(void)
{
        HAL_TIM_IRQHandler(&TIM33_Handler);                                //定时器共用处理函数
}

//定时器更新中断(计数溢出)中断处理回调函数, 该函数在HAL_TIM_IRQHandler中会被调用,实现多个计数器满装载的计数
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)//更新中断(溢出)发生时执行
{
        if((TIM3CH3_CAPTURE_STA&0X80)==0)                                //还未成功捕获上升沿
        {
                if(TIM3CH3_CAPTURE_STA&0X40)                                //已经捕获到高电平了
                {
                        if((TIM3CH3_CAPTURE_STA&0X3F)==0X3F)        //高电平太长了
                        {
                                TIM3CH3_CAPTURE_STA|=0X80;                        //标记成功捕获了一次
                                TIM3CH3_CAPTURE_VAL=0XFFFF;
                        }else TIM3CH3_CAPTURE_STA++;
                }         
        }               
}

//定时器输入捕获中断处理回调函数,该函数在HAL_TIM_IRQHandler中会被调用
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)//捕获中断发生时执行
{
        if((TIM3CH3_CAPTURE_STA&0X80)==0)                                //还未成功捕获
        {
                if(TIM3CH3_CAPTURE_STA&0X40)                                //捕获到一个下降沿                 
                {                                 
                        TIM3CH3_CAPTURE_STA|=0X80;                                //标记成功捕获到一次高电平脉宽
            TIM3CH3_CAPTURE_VAL=HAL_TIM_ReadCapturedValue(&TIM33_Handler,TIM_CHANNEL_3);//获取当前的捕获值.
                        TIM_RESET_CAPTUREPOLARITY(&TIM33_Handler,TIM_CHANNEL_3);   //一定要先清除原来的设置!!
            TIM_SET_CAPTUREPOLARITY(&TIM33_Handler,TIM_CHANNEL_3,TIM_ICPOLARITY_RISING);//配置TIM3通道3上升沿捕获
                }else                                                                                  //还未开始,第一次捕获上升沿
                {
                        TIM3CH3_CAPTURE_STA=0;                                        //清空
                        TIM3CH3_CAPTURE_VAL=0;
                        TIM3CH3_CAPTURE_STA|=0X40;                                //标记捕获到了上升沿
                        __HAL_TIM_DISABLE(&TIM33_Handler);              //关闭定时器3
                        __HAL_TIM_SET_COUNTER(&TIM33_Handler,0);
                        TIM_RESET_CAPTUREPOLARITY(&TIM33_Handler,TIM_CHANNEL_3);   //一定要先清除原来的设置!!
                        TIM_SET_CAPTUREPOLARITY(&TIM33_Handler,TIM_CHANNEL_3,TIM_ICPOLARITY_FALLING);//定时器3通道3设置为下降沿捕获
                        __HAL_TIM_ENABLE(&TIM33_Handler);                //使能定时器3
                }                    
        }               
}



避障停车.7z

548.44 KB, 下载次数: 22, 下载积分: 黑币 -5

能正常运行

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表