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

article/2025/10/7 12:02:07

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 实验结果

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


http://chatgpt.dhexx.cn/article/1e9T6JZt.shtml

相关文章

【STM32F407的DSP教程】第13章 DSP快速计算函数-三角函数和平方根

完整版教程下载地址:http://www.armbbs.cn/forum.php?modviewthread&tid94547 第13章 DSP快速计算函数-三角函数和平方根 本期教程开始,我们将不再专门的分析DSP函数的源码,主要是有些DSP函数的公式分析较麻烦,有兴…

【STM32H7的DSP教程】第18章 DSP控制函数-更好用的SIN,COS计算

完整版教程下载地址:http://www.armbbs.cn/forum.php?modviewthread&tid94547 第18章 DSP控制函数-更好用的SIN,COS计算 本期教程主要讲解控制函数中的cos和sin函数数值的获取,这里使用的函数比起第13章中使用的sin和cos函数数值…

【STM32H7的DSP教程】第13章 DSP快速计算函数-三角函数和平方根

完整版教程下载地址:http://www.armbbs.cn/forum.php?modviewthread&tid94547 第13章 DSP快速计算函数-三角函数和平方根 本期教程开始,我们将不再专门的分析DSP函数的源码,主要是有些DSP函数的公式分析较麻烦,有兴趣…

【STM32F407的DSP教程】第49章 STM32F407的自适应滤波器实现,无需Matlab生成系数(支持实时滤波)

完整版教程下载地址:事隔五年之后,开启第2版DSP数字信号处理和CMSIS-NN神经网络教程,同步开启三代示波器,更至49章(2021-09-20) - STM32H7 - 硬汉嵌入式论坛 - Powered by Discuz!http://www.armbbs.cn/for…

matlab的cheblord函数,【安富莱DSP教程】第39章 IIR滤波器的Matlab设计

第39章 IIR滤波器的Matlab设计 本章节讲解IIR滤波器的Matlab设计,主要包括巴特沃斯滤波器,切比雪夫I型和II型滤波器以及椭圆滤波器。 39.1 巴特沃斯滤波器的设计 39.2 切比雪夫滤波器的设计 39.3 椭圆滤波器的设计 39.4 总结 39.1 巴特沃斯滤波器的设计 39.1.1butter函数 功能…

【STM32H7的DSP教程】第48章 STM32H7的中值滤波器实现,适合噪声和脉冲过滤(支持逐个数据的实时滤波)

完整版教程下载地址:http://www.armbbs.cn/forum.php?modviewthread&tid94547 第48章 STM32H7的中值滤波器实现,适合噪声和脉冲过滤(支持逐个数据的实时滤波) 本章节讲解中值滤波器实现,适用于噪声和脉冲…

【STM32F429的DSP教程】第49章 STM32F429的自适应滤波器实现,无需Matlab生成系数(支持实时滤波)

完整版教程下载地址:事隔五年之后,开启第2版DSP数字信号处理和CMSIS-NN神经网络教程,同步开启三代示波器,更至49章(2021-09-20) - STM32H7 - 硬汉嵌入式论坛 - Powered by Discuz!http://www.armbbs.cn/for…

【STM32F429的DSP教程】第25章 DSP变换运算-快速傅里叶变换原理(FFT)

完整版教程下载地址:http://www.armbbs.cn/forum.php?modviewthread&tid94547 第25章 DSP变换运算-快速傅里叶变换原理(FFT) 在数字信号处理中常常需要用到离散傅立叶变换(DFT),以获取信号的频域特征。尽管传统的DFT…

【STM32F429的DSP教程】第33章 STM32F429不限制点数FFT实现

完整版教程下载地址:http://www.armbbs.cn/forum.php?modviewthread&tid94547 第33章 STM32F429不限制点数FFT实现 本章主要讲解不限制点数FFT的实现。 目录 33.1 初学者重要提示 33.2 不限制点数FFT移植 33.2.1 移植FFT相关文件 33.2.2 添加路径…

【STM32H7的DSP教程】第16章 DSP功能函数-数据拷贝,数据填充和浮点转定点

完整版教程下载地址:http://www.armbbs.cn/forum.php?modviewthread&tid94547 第16章 DSP功能函数-数据拷贝,数据填充和浮点转定点 本期教程主要讲解功能函数中的数据拷贝,数据填充和浮点数转换为定点数。 目录 第16章 …

【STM32F407的DSP教程】第33章 STM32F407不限制点数FFT实现

完整版教程下载地址:http://www.armbbs.cn/forum.php?modviewthread&tid94547 第33章 STM32F407不限制点数FFT实现 本章主要讲解不限制点数FFT的实现。 目录 33.1 初学者重要提示 33.2 不限制点数FFT移植 33.2.1 移植FFT相关文件 33.2.2 添加路径…

【STM32H7的DSP教程】第3章 Matlab简易使用之基础操作

完整版教程下载地址:http://www.armbbs.cn/forum.php?modviewthread&tid94547 第3章 Matlab简易使用之基础操作 本期教程开始讲解Matlab的简易使用之基础操作,作为学习DSP的必备软件,掌握简单的Matlab操作是必须的。 目录 第3章 …

[经验] 【安富莱——DSP教程】第7章 DSP定点数和浮点数(重要)

http://bbs.elecfans.com/jishu_486119_1_1.html 7.1 定点数和浮点数概念 如果小数点的位置事先已有约定,不再改变,此类数称为“定点数”。相比之下,如果小数点的位置可变,则称为“浮点数”(定点数的本质是小数…

【STM32F407的DSP教程】第21章 DSP矩阵运算-加法,减法和逆矩阵

完整版教程下载地址:http://www.armbbs.cn/forum.php?modviewthread&tid94547 第21章 DSP矩阵运算-加法,减法和逆矩阵 本期教程主要讲解矩阵运算中的初始化,加法,逆矩阵和减法。 目录 第21章 DSP矩阵运算-加…

【STM32H7的DSP教程】第17章 DSP功能函数-定点数互转

完整版教程下载地址:http://www.armbbs.cn/forum.php?modviewthread&tid94547 第17章 DSP功能函数-定点数互转 本期教程主要讲解功能函数中的Q7,Q15和Q31分别向其它类型数据转换。 目录 第17章 DSP功能函数-定点数互转 17.1 初学者…

【STM32F407的DSP教程】第19章 DSP复数运算-共轭,点乘和求模

完整版教程下载地址:http://www.armbbs.cn/forum.php?modviewthread&tid94547 第19章 DSP复数运算-共轭,点乘和求模 本期教程主要讲解复数运算中的共轭,点乘和模的求解。 目录 第19章 DSP复数运算-共轭,点乘…

【STM32F407的DSP教程】第1章 初学数字信号处理准备工作

完整版教程下载地址:http://www.armbbs.cn/forum.php?modviewthread&tid94547 第1章 初学数字信号处理准备工作 本期教程开始带领大家学习DSP教程,学习前首先要搞明白一个概念,DSP有两层含义,一个是DSP芯片也就是Digital…

【STM32H7的DSP教程】第11章 DSP基础函数-绝对值,求和,乘法和点乘

完整版教程下载地址:http://www.armbbs.cn/forum.php?modviewthread&tid94547 第11章 DSP基础函数-绝对值,求和,乘法和点乘 本期教程开始学习ARM官方的DSP库,这里我们先从基本数学函数开始。本期教程主要讲绝对值&am…

c++中ifstream和ofstream的详细用法

TITLE:因为不经常用这两个操作,每次用都得找,网上的文章良莠不齐,有时候不容易找到合适的,故将其记录下来,供以后使用方便。 1. fstream fstream提供了三个类,用来实现c对文件的操作。&#x…

C++文件读取ifstream

使用ifstream流来读取文件 说明: 1.ifstream类的对象创建成功的时候会返回非空值,借此判断是否创建文件对象成功 2.ifstream有个函数eof()用来判断文件是否读到尾部,没读到尾部返回false,否则返回true。 若尾部有回车,那么最后一…