0 前言

这一节我们来学习DSP的ECAP模块的功能。实验目标:通过超声波测距模块,将采集所测量距离显示在电脑串口助手上。

本节将分为硬件部分、软件部分和实验展示三个方面进行介绍,不清楚的欢迎留言。

1 硬件部分

需要四个硬件如图1所示:超声波模块HC-SR04、DSP28335核心板、烧写器、USB转串口模块。

图1 硬件实物图

超声波模块有四个接口,分别为VCC(+5V)、TRIG(控制端)、ECHO(接收端)和GND,其工作原理如下:
(1)采用IO口输入信号到TRIG接口触发测距,给至少10us的高电平信号;
(2)触发后,模块自动发送8个40kHz的方波,自动检测是否有信号返回;
(3)若有信号返回,ECHO接口将输出一个高电平,其高电平的持续时间就是超声波从发射到返回的时间;
(4)测量距离=(高电平时间*声速)/2,其中声速=340m/s。
为了更清楚的表示超声波工作过程,图2给出了输入输出信号的时序图。

图2 超声波模块工作时序图

因此,在实验过程中,采用DSP的ECAP管脚连接到HC-SR04的ECHO接口,再用一个普通IO口连接到TRIG接口作为触发源管脚即可。其中,具体的硬件连接如图3所示。

图3 硬件接线图

2 软件部分

在软件部分,分为超声波模块功能和串口显示。

首先我们看超声波模块的代码:(注意:查看代码时双击点进去看,否则会内容不全)。

需要注意:
(1)ECAP要设置为单次模式,不能设置连续模式,因为这里超声波模块每触发一次只输出一次回响信号,因此我们只需要捕获信号的上升沿和下降沿即可,即上升沿捕获计数值储存在捕获寄存器CAP1中,而下降沿计数值储存在寄存器CAP2中。否则,所测量的捕获信号将可能储存在CAP3或CAP4中,对后面计算距离造成不便。在这里,我们设置在捕获事件2发生后重新刷新Mod4计数器,具体过程如图4所示。

图4 单次和连续捕获过程

(2)测量距离(单位mm)=(高电平时间*声速)/2=(CAP2值-CAP1值)×170/(150×1000)。其中150是代表DSP28335时钟频率为150MHz,1000是米到毫米的单位换算。

bsp_cap.c

/***  *********************************************************************************************  @file                 bsp_cap.c*  @file                 SK Electronics*  @version           V1.0*  @date               2021-xx-xx*  @brief               CAP应用函数接口*  ********************************************************************************************  @attention*  实验平台:SK-F28335Mini   核心板*  CSDN博客:https://blog.csdn.net/weixin_46556696*  淘宝:https://shop409670932.taobao.com*/#include "bsp_cap.h"
#include "bsp_sci.h"
extern Uint32 cap_val,Distan;
extern char Distan_ASCII[2];/***  @brief                   初始化ECAP1配置*  @parameter                  无*  @return_value               无*/
void Init_ECap1(void)
{InitECap1Gpio();EALLOW;GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 0;//普通IO模式GpioCtrlRegs.GPADIR.bit.GPIO0 = 1;//配置成输出EDIS;ECap1Regs.ECEINT.all = 0x0000;    // 关闭所有的CAP中断ECap1Regs.ECCLR.all = 0xFFFF;     // 清除所有的CAP中断标志位ECap1Regs.ECCTL1.all = 0x0000;   // 复位控制寄存器2ECap1Regs.ECCTL2.all = 0x0000;   // 复位控制寄存器2ECap1Regs.TSCTR = 0;    // 计数清零ECap1Regs.CTRPHS = 0;   // 计数相位寄存器清零ECap1Regs.ECCTL1.bit.CAP2POL = 1;//捕获事件2下降沿触发ECap1Regs.ECCTL1.bit.CTRRST2 = 1;//捕获事件2发生时计数器复位ECap1Regs.ECCTL1.bit.CAP4POL = 1;//捕获事件4下降沿触发ECap1Regs.ECCTL1.bit.CTRRST4 = 1;//捕获事件4发生时计数器复位ECap1Regs.ECCTL1.bit.CAPLDEN = 1;//使能在捕获事件发生时装载CAP1~CAP4ECap1Regs.ECCTL1.bit.FREE_SOFT = 2;//TSCTR不受仿真影响ECap1Regs.ECCTL2.bit.STOP_WRAP = 1;//在捕获事件2发生后停止(单次模式)ECap1Regs.ECCTL2.bit.TSCTRSTOP = 1;//开始计数ECap1Regs.ECCTL2.bit.SYNCO_SEL = 2;//禁止SYNC_OUT输出信号ECap1Regs.ECEINT.bit.CEVT2 = 1;  // 使能捕获事件2发生中断
}/***  @brief                  计算距离*  @parameter                  无*  @return_value               无*/
void ReadDistance(void)
{GpioDataRegs.GPASET.bit.GPIO0 = 1;   //Trig引脚输出高电平DELAY_US(15);   //至少10us,本实验给15usGpioDataRegs.GPACLEAR.bit.GPIO0 = 1;   // Trig引脚输出低Distan = cap_val*170/150000;   // 计算距离,此处单位为mmscia_msg("当前测距:\0");hextoascii(Distan);scia_msg(Distan_ASCII);scia_msg("mm\r\n");
}

bsp_cap.h

/***  *********************************************************************************************  @file                 bsp_cap.h*  @file                 SK Electronics*  @version           V1.0*  @date               2021-xx-xx*  @brief               CAP应用函数接口头文件*  ********************************************************************************************  @attention*  实验平台:SK-F28335Mini   核心板*  CSDN博客:https://blog.csdn.net/weixin_46556696*  淘宝:https://shop409670932.taobao.com*/#include "DSP28x_Project.h"
void Init_ECap1(void);
void ReadDistance(void);

串口模块显示代码:
bsp_sci.c

/***  *********************************************************************************************  @file                 bsp_sci.c*  @file                 SK Electronics*  @version           V1.0*  @date               2021-xx-xx*  @brief               串口通信应用函数接口*  ********************************************************************************************  @attention*  实验平台:SK-F28335Mini   核心板*  CSDN博客:https://blog.csdn.net/weixin_46556696*  淘宝:https://shop409670932.taobao.com*/
#include "bsp_sci.h"
extern char Distan_ASCII[4];
/***  @brief                   初始化SCI串口配置*  @parameter                  无*  @return_value               无*/
void Sci_Init(void)
{//SCI的工作模式和参数需要用户在后面的学习中,深入的了解一个寄存器底层相关的资料了,多看看芯片手册和寄存器的意思。//因为28335的寄存器太多了,所以在以后的学习过程中,就不会对寄存器进行详细的注释了。InitSciaGpio();SciaRegs.SCICCR.all=0x07;// 1 stop bit,  No loopback// No parity,8 char bits// async mode, idle-line protocolSciaRegs.SCICTL1.all=0x03;// enable TX, RX, internal SCICLK,#if(CPU_FRQ_150MHZ)SciaRegs.SCIHBAUD=0x0001;// 9600 baud @LSPCLK = 37.5MHz.SciaRegs.SCILBAUD=0x00E7;#endif#if(CPU_FRQ_100MHZ)SciaRegs.SCIHBAUD=0x0001;// 9600 baud @LSPCLK = 20MHz.SciaRegs.SCILBAUD=0x0044;#endif// SciaRegs.SCICTL2.bit.RXBKINTENA=1;// SciaRegs.SCICTL2.bit.TXINTENA=1;//SciaRegs.SCICCR.bit.LOOPBKENA=1;SciaRegs.SCICTL1.bit.SWRESET=1;// PieCtrlRegs.PIECTRL.bit.ENPIE=1;// IER|=M_INT9;// PieCtrlRegs.PIEIER9.bit.INTx1=1;// PieCtrlRegs.PIEIER9.bit.INTx2=1;}void scia_xmit(int a)//发送字节的函数
{while (SciaRegs.SCICTL2.bit.TXRDY == 0) {}SciaRegs.SCITXBUF=a;}void hextoascii(unsigned char num)//十位数字转化为对应ASCII格式
{char one,ten,hundred,thousand=0;one=num/1%10;//取个位ten=num/10%10;//取十位hundred=num/100%10;//取百位thousand=num/1000%10;//取千位Distan_ASCII[0]=thousand+0x30;Distan_ASCII[1]=hundred+0x30;Distan_ASCII[2]=ten+0x30;Distan_ASCII[3]=one+0x30;
}
void scia_msg(char * msg)//发送数组的函数
{int i;i = 0;SciaRegs.SCICTL2.bit.TXINTENA=0;while(msg[i] != '\0'){scia_xmit(msg[i]);i++;}SciaRegs.SCICTL2.bit.TXINTENA=1;
}

bsp_sci.h

/***  *********************************************************************************************  @file                 bsp_sci.h*  @file                 SK Electronics*  @version           V1.0*  @date               2021-xx-xx*  @brief               串口通信函数接口头文件*  ********************************************************************************************  @attention*  实验平台:SK-F28335Mini   核心板*  CSDN博客:https://blog.csdn.net/weixin_46556696*  淘宝:https://shop409670932.taobao.com*/#ifndef _BSP_SCI_H_
#define _BSP_SCI_H_
#include "DSP28x_Project.h"void Sci_Init(void);
void scia_xmit(int a);//发送字节的函数
void scia_msg(char * msg);//发送数组的函数
void hextoascii(unsigned char num);
#endif /*_BSP_SCI_H_ */

main.c

/***  *********************************************************************************************  @file                 main.c*  @file                 SK Electronics*  @version           V1.0*  @date               2020-xx-xx*  @brief               ECAP超声波测距实验*  ********************************************************************************************  @attention*  实验平台:SK-F28335Mini   核心板*  CSDN博客:https://blog.csdn.net/weixin_46556696*  淘宝:https://shop409670932.taobao.com*/
#include "DSP28x_Project.h"
#include "bsp_cap.h"
#include "bsp_sci.h"
#define FLASH_RUN 1
#define SRAM_RUN 2
#define RUN_TYPE FLASH_RUN
#if RUN_TYPE==FLASH_RUN
extern Uint16 RamfuncsLoadStart;
extern Uint16 RamfuncsLoadEnd;
extern Uint16 RamfuncsRunStart;
#endif
/**************************************变量定义************************************************/
Uint32 cap_val=0,Distan=0;
char Distan_ASCII[4]={0,0,0,0};//存放测量距离的ASCII转换结果/**************************************声明区**************************************************/
__interrupt void Ecap1_isr(void);   // Ecap1_isr()函数声明
interrupt void scia_Tx_isr(void);
interrupt void scia_Rx_isr(void);
void delay_1ms(Uint16 t);
/***  @brief                           主函数*  @parameter                  无*  @return_value               无*/
void main(void)
{/*第一步:初始化系统控制:*/InitSysCtrl();/*第二步:初始化GPIO口*/InitGpio();/* 第三步:清除所有中断 和初始化 PIE 向量表:*/DINT;// 关闭全局中断InitPieCtrl();// 初始化 PIE 控制寄存器到默认状态,默认状态是全部 PIE 中断被禁用和标志位被清除IER = 0x0000;// 禁用 CPU 中断和清除所有 CPU 中断标志位:IFR = 0x0000;InitPieVectTable();// 初始化 PIE 中断向量表// 中断重映射,注册中断程序入口(用户按需求添加)EALLOW;PieVectTable. ECAP1_INT = &Ecap1_isr;   // ECAP1_INT的中断映射EDIS;///*程序烧录入28335(可选的)*/
#if RUN_TYPE==FLASH_RUNMemCopy(&RamfuncsLoadStart,&RamfuncsLoadEnd,&RamfuncsRunStart);InitFlash();
#endif
/* 第四步: 初始化片上外设*/// InitPeripherals();  //初始化所有外设(本例程不需要)Sci_Init();//初始化和配置SCIA串口通信Init_ECap1();   // ECap1模块初始化IER |= M_INT4;  //使能第一组中断PieCtrlRegs.PIEIER4.bit.INTx1 = 1; //使能第四组中断里的第一个中断--CAP1中断/* 第五步:添加用户功能具体代码*/EINT;ERTM;scia_msg("Hello SK Electronics!\r\n\0");scia_msg("更详细的DSP基础教程,请关注支持本人博客哈!\r\n\0");scia_msg("CSDN博客:https://blog.csdn.net/weixin_46556696\r\n\0");scia_msg("淘宝店铺:https://shop409670932.taobao.com\r\n\0");for(;;){ReadDistance();   // 计算距离delay_1ms(500);   // 延时500ms}
}void delay_1ms(Uint16 t)
{while(t--){DELAY_US(1000);}
}/***  @brief                  ECAP1中断服务函数*  @parameter                  无*  @return_value               无*/
__interrupt void Ecap1_isr(void)
{PieCtrlRegs.PIEACK.all = PIEACK_GROUP4; // 清除CAP1的PIE中断标志ECap1Regs.ECCLR.bit.INT = 1;      // 清除ECap1中断标志位ECap1Regs.ECCLR.bit.CEVT2 = 1;    // 清除事件2标志位cap_val=(int32)ECap1Regs.CAP2 - (int32)ECap1Regs.CAP1;   // 计算脉冲
}

3 实验展示

程序烧录进去后,图5所示在串口助手和在CCS变量窗口可以看到超声波所测量的距离。

图5 实验结果

大家可以参考代码尝试一下, 有疑问的欢迎留言!!

(十)DSP28335基础教程——ECAP实验(超声波测距)相关推荐

  1. 【STM32】标准库与HAL库对照学习教程外设篇--超声波测距传感器

    [STM32]标准库与HAL库对照学习教程外设篇--超声波测距传感器 一.前言 二.准备工作 三.超声波测距传感器 1.原理说明 2.使用说明 四.标准库使用传感器 1.实验程序 2.实验效果 五.H ...

  2. 大学计算机基础教程excel实验报告,大学计算机基础教程excel实验报告.doc

    大学计算机基础教程excel实验报告 实验报告 课程名称 计算机应用基础 实验项目名称 Excel综合实验 班级与班级代码 国际金融2班 实验室名称(或课室) 专 业 国际金融 任课教师 学号 112 ...

  3. 蓝桥杯单片机学习过程记录(二十九)第八届国赛超声波测距机

    蓝桥杯单片机学习过程记录(二十九)第八届国赛超声波测距机 题目如下: 已完成 应用的内容: EEPROM. 定时器.数码管 led灯,独立按键 DA电压输出 超声波测距 /* ------------ ...

  4. (十)基于Linux算时差——超声波测距原理及代码实现

    学习日志(十) 基于Linux算时差--超声波测距原理及代码实现 测距原理基本说明 超声波测距模块:是用来测量距离的一种产品,通过发送和收超声波,利用时间差和声音传播速度,计算出模块到前方障碍物的距离 ...

  5. (四)DSP28335基础教程——SCI串口通信实验(上位机收发显示)

    0 前言 本期的实验目的为:使用核心板上的SCI串口通信功能,在电脑端上位机,输入数字0,1,2,3,4,分别控制五个LED亮灭. 1 DSP代码 (注意:查看代码时双击点进去看,否则会内容不全). ...

  6. (七)DSP28335基础教程——I2C通信实验(OLED显示控制)

    0 前言 本期实验目标:采用硬件I2C模块与OLED进行通信,完成显示控制. 目前发现28335比较缺乏关于I2C模块的实用例程,许多新手在配置使用该模块比较难上手,走弯路.那么通过该例程,大家则可以 ...

  7. (五)DSP28335基础教程——外部中断控制(按键触发)

    0 前言 本期实验目标:采用外部中断方式响应按键触发,实现LED电平反转. 外部中断是DSP十分常用的功能,通常用来响应一些控制操作,比如判断按键是否按下,传感器是否接收到信号等等.那么通过该例程,大 ...

  8. 大学计算机基础教程excel实验报告,大学计算机基础教程excel实验报告

    实实验验报报告告 课程名称课程名称 计算机应用基础 实验项目名称实验项目名称 Excel 综合实验 班级与班级代码班级与班级代码 国际金融 2 班 实验室名称 或课室 实验室名称 或课室 专专 业业 ...

  9. oracle基础教程实验,Oracle 11g 基础教程与实验指导(配光盘)(清华电脑学堂)

    第1章 Oracle11g关系数据库 1.1 关系数据模型 1.1.1 数据结构 1.1.2 关系的完整性约束 1.1.3 关系数据模型的特点 1.2 关系数据库的范式理论 1.2.1 第一范式 1. ...

  10. (二)DSP28335基础教程——GPIO输入(矩阵按键扫描)

    0 前言 GPIO输入功能是28335非常重要的部分,可通过外部数字逻辑信号的输入,作为逻辑触发控制的判断条件.比如在电机控制中,通过判断输入管脚的电平状态,实现电机调速.在显示屏人机界面下,也可通过 ...

最新文章

  1. centos php sftp 扩展,Linux(CentOS)上配置 SFTP
  2. [已解决] InnoDB: preallocating bytes for file ./ibdata1 failed with error
  3. Python -二维数组定义
  4. error: 'for' loop initial declarations are only allowed in C99 mode
  5. 在 wxWidgets 中播放声音的示例
  6. onenote创建快速笔记--此分区尚不可用,它是从其他设备添加的,该设备同步后才将可用
  7. 《离散数学》双语专业词汇表 名词术语中英文索引
  8. linux-路径的切换-文件的增删拷-目录的增删拷
  9. Linux内存管理之红黑树(五)
  10. @Transactional之Spring事务深入理解
  11. 欧拉函数及其扩展 小结
  12. 微信浏览器关闭当前界面
  13. 【托业】【新托业TOEIC新题型真题】学习笔记1--题库一--P1~4
  14. Spring boot出现java.awt.HeadlessException【已解决】
  15. idea 懒人神器 保存自动格式化 Save Action插件
  16. linux时区文件格式,干货|理解Linux系统的时区、夏令时
  17. Mysql主从备份数据库服务器搭建
  18. 电脑通过二维码打开手机链接
  19. 输入一个三位数,输出它 个位、十位、百位 数字之和
  20. interpro 数据库

热门文章

  1. win7设置无线wifi连接到服务器,自动连接wifi怎么设置_如何设置无线网自动连接...
  2. 卷积神经网络表情识别,神经网络动作识别
  3. springboot配置logback
  4. 学习笔记_循环语句的嵌套
  5. 抽奖活动+mysql_简单的活动抽奖算法方案
  6. Direct Rendering Manager (DRM)
  7. 华为云免费试用_如何试用华为云服务器
  8. 教你 用c语言输出乘法口诀表 一giao我嘞gaiogiao
  9. 半/全加器中的异或门和与门的应用
  10. 少儿编程--STEMA考试介绍转自STEMA (STEM 能力测试) 考 试 白 皮 书