文章目录

  • 前言
  • 1 eCAP简介
  • 2 eCAP模块结构原理图
  • 3 ePWM3配置步骤:InitEPwmTimer()
  • 4 eCAP1配置步骤:InitECapture()
  • 5 ISR:周期及占空比计算
  • 6 主函数
  • 6 实验分析
  • 总结
    • 除了强大高效的算力,更特别适合于运动控制

前言

随开发板带的教程并没有给出eCAP的解释和例程。
通过TI给出的源码结合调试开发板,正式看懂eCAP。
特此记录,加深印象~


本文用eCAP1捕获ePWM3生成50%占空比的脉冲,并验证该脉冲的周期和占空比

1 eCAP简介

eCAP即增强型捕获模块。
捕获模块能够捕获外部输入引脚的逻辑状态(电平的高或低、电平翻转时的上升沿或下降沿),并利用内部定时器对外部事件或者引脚状态的变化进行处理。

典型应用有:
- 电机测速
- 测量脉冲电平事件
- 测量脉冲信号周期和占空比
- 电压/电流传感器的PWM编码信号的解码

2 eCAP模块结构原理图


CAP模式下,捕获信号经过分频和极性选择后进行识别,对应时刻TSCTR的值存入CAP1-4,用于计算脉冲周期和占空比。

3 ePWM3配置步骤:InitEPwmTimer()

上一篇博客TI DSP 28335 ePWM实现单路带死区PWM仔细介绍过ePWM配置。
此处不再注释。

ePWM3频率TBCLK75MHzSYSCLKOUT/2),占空比50%(即占(PWM3_TIMER_MAX +1)/TBCLK),周期T2*(PWM3_TIMER_MAX +1)/TBCLK

#define PWM3_TIMER_MAX     8000
void InitEPwmTimer()
{EALLOW;SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0;EDIS;EPwm3Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP; // Count upEPwm3Regs.TBPRD = PWM3_TIMER_MAX;EPwm3Regs.TBPHS.all = 0x00000000;EPwm3Regs.AQCTLA.bit.PRD = AQ_TOGGLE;      // Toggle on PRD// TBCLK = SYSCLKOUT/2EPwm3Regs.TBCTL.bit.HSPCLKDIV = 1;EPwm3Regs.TBCTL.bit.CLKDIV = 0;EALLOW;SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1;EDIS;
}

4 eCAP1配置步骤:InitECapture()

对eCAP1的配置步骤进行了详细的注释。

void InitECapture()
{// 失能eCAP1所有中断ECap1Regs.ECEINT.all = 0x0000;             // Disable all capture interrupts// 清除eCAP1所有中断标志位ECap1Regs.ECCLR.all = 0xFFFF;              // Clear all CAP interrupt flags// 禁止在捕获事件发生时装载CAP1-CAP4ECap1Regs.ECCTL1.bit.CAPLDEN = 0;          // Disable CAP1-CAP4 register loads// TSCTR停止计数ECap1Regs.ECCTL2.bit.TSCTRSTOP = 0;        // Make sure the counter is stopped// 配置外设寄存器// 运行于单次模式ECap1Regs.ECCTL2.bit.CONT_ONESHT = 1;      // One-shot// 单次模式下捕获事件4之后停止ECap1Regs.ECCTL2.bit.STOP_WRAP = 3;        // Stop at 4 events// 上升沿触发捕获事件1ECap1Regs.ECCTL1.bit.CAP1POL = 0;          // Rising edge// 下降沿触发捕获事件2ECap1Regs.ECCTL1.bit.CAP2POL = 1;          // Falling edge// 上升沿触发捕获事件3ECap1Regs.ECCTL1.bit.CAP3POL = 0;          // Rising edge// 下降沿触发捕获事件4ECap1Regs.ECCTL1.bit.CAP4POL = 1;          // Falling edge// 差分模式// 在捕获事件1发生时复位计数器ECap1Regs.ECCTL1.bit.CTRRST1 = 1;          // Difference operation// 在捕获事件2发生时复位计数器ECap1Regs.ECCTL1.bit.CTRRST2 = 1;          // Difference operation// 在捕获事件3发生时复位计数器ECap1Regs.ECCTL1.bit.CTRRST3 = 1;          // Difference operation// 在捕获事件4发生时复位计数器ECap1Regs.ECCTL1.bit.CTRRST4 = 1;          // Difference operation// 使能计时器同步ECap1Regs.ECCTL2.bit.SYNCI_EN = 1;         // Enable sync in// 同步输入SYNC_IN将作为同步输出SYNC_OUTECap1Regs.ECCTL2.bit.SYNCO_SEL = 0;        // Pass through                        // 使能在捕获事件发生时装载CAP1-CAP4ECap1Regs.ECCTL1.bit.CAPLDEN = 1;          // Enable capture units// TSCTR开始计数ECap1Regs.ECCTL2.bit.TSCTRSTOP = 1;        // Start Counter// Mod4重新装载ECap1Regs.ECCTL2.bit.REARM = 1;            // arm one-shot// 使能捕获事件4中断ECap1Regs.ECEINT.bit.CEVT4 = 1;            // 4 events = interrupt
}

5 ISR:周期及占空比计算

修改TI源码的ISR。
为方便观察实验结果,在InitECapture()中配置为差分模式。
该ISR能得到脉冲的周期、占空比以及进入CAP中断的次数。

interrupt void ecap1_isr(void)
{// 提取CAP1-CAP4的值TSt1 = ECap1Regs.CAP1;TSt2 = ECap1Regs.CAP2;TSt3 = ECap1Regs.CAP3;TSt4 = ECap1Regs.CAP4;// 计算周期Period1 = TSt1 + TSt2;Period2 = TSt3 + TSt4;// 计算占空比Duty1 = TSt1 / Period1;Duty2 = TSt3 / Period2;// 中断次数ECap1IntCount++;// 清除捕获事件4中断标志位ECap1Regs.ECCLR.bit.CEVT4 = 1;// 清除全局中断标志位ECap1Regs.ECCLR.bit.INT = 1;// Mod4重新装载ECap1Regs.ECCTL2.bit.REARM = 1;// 允许响应同组中断PieCtrlRegs.PIEACK.all = PIEACK_GROUP4;
}

6 主函数

这部分并没有修改TI的源码,只是增加了周期、占空比变量的声明。

#include "DSP28x_Project.h"     // Device Headerfile and Examples Include File// Configure the start/end period for the timer
#define PWM3_TIMER_MIN     10
#define PWM3_TIMER_MAX     8000// Prototype statements for functions found within this file.
interrupt void ecap1_isr(void);
void InitECapture(void);
void InitEPwmTimer(void);// Global variables used in this example
Uint32  ECap1IntCount;// 周期、占空比声明
Uint32  TSt1 = 0;
Uint32  TSt2 = 0;
Uint32  TSt3 = 0;
Uint32  TSt4 = 0;
float32 Period1 = 0;
float32 Period2 = 0;
float32 Duty1 = 0;
float32 Duty2 = 0;void main(void)
{// Step 1. Initialize System Control:
// PLL, WatchDog, enable Peripheral Clocks
// This example function is found in the DSP2833x_SysCtrl.c file.InitSysCtrl();// Step 2. Initalize GPIO:
// This example function is found in the DSP2833x_Gpio.c file and
// illustrates how to set the GPIO to it's default state.
// InitGpio();  // Skipped for this example  InitEPwm3Gpio();InitECap1Gpio();// Step 3. Clear all interrupts and initialize PIE vector table:
// Disable CPU interrupts DINT;// Initialize the PIE control registers to their default state.
// The default state is all PIE interrupts disabled and flags
// are cleared.
// This function is found in the DSP2833x_PieCtrl.c file.InitPieCtrl();// Disable CPU interrupts and clear all CPU interrupt flags:IER = 0x0000;IFR = 0x0000;// Initialize the PIE vector table with pointers to the shell Interrupt
// Service Routines (ISR).
// This will populate the entire table, even if the interrupt
// is not used in this example.  This is useful for debug purposes.
// The shell ISR routines are found in DSP2833x_DefaultIsr.c.
// This function is found in DSP2833x_PieVect.c.InitPieVectTable();// Interrupts that are used in this example are re-mapped to
// ISR functions found within this file.  EALLOW;  // This is needed to write to EALLOW protected registersPieVectTable.ECAP1_INT = &ecap1_isr;EDIS;    // This is needed to disable write to EALLOW protected registers// Step 4. Initialize all the Device Peripherals:
// This function is found in DSP2833x_InitPeripherals.c
// InitPeripherals();  // Not required for this exampleInitEPwmTimer();    // For this example, only initialize the ePWM TimersInitECapture();// Step 5. User specific code, enable interrupts:// Initalize counters:   ECap1IntCount = 0;// ECap1PassCount = 0;// Enable CPU INT4 which is connected to ECAP1-4 INT:IER |= M_INT4;// Enable eCAP INTn in the PIE: Group 3 interrupt 1-6PieCtrlRegs.PIEIER4.bit.INTx1 = 1;// Enable global Interrupts and higher priority real-time debug events:EINT;   // Enable Global interrupt INTMERTM;   // Enable Global realtime interrupt DBGM// Step 6. IDLE loop. Just sit and loop forever (optional):for(;;){asm("          NOP");}}

6 实验分析

ePWM3输出的引脚EPWM3A(即GPIO4)接到eCAP1的捕获引脚ECAP1(即GPIO24)。

ePWM3频率TBCLK75MHzSYSCLKOUT/2),高、低电平各占50%,即占(PWM3_TIMER_MAX +1)/TBCLK,在该例为

 Ton=Toff=(PWM3_TIMER_MAX +1)/TBCLK=(8000+1)/75

eCAP并未分频,其计数器频率为为150MHzSYSCLKOUT),对ePWM3生成的高、低电平进行捕获,TCR应为

 TCRcap=Ton*SYSCLKOUT=(8000+1)/75*150=16002

实际仿真为16001,见下图。
误差为

 Terror=1*SYSCLKOUT=1/150MHz=6.67ns

个人认为这完全在可接受范围内。

占空比仿真结果同理论结果,均为50%

总结

第39篇

由于手头没有对应的编码器等试验器材,增强型正交编码脉冲eQEP这一章节就不进行学习了。日后如有接触再进行对应学习。
学习到这,已经能看到DSP的特点:

除了强大高效的算力,更特别适合于运动控制

愿今日之所自学,他日能助我一臂之力。

个人水平有限,有问题欢迎各位大神批评指正!

TI DSP 28335 eCAP 测量脉冲占空比相关推荐

  1. TI DSP 28335 ADC连续采样检测SPI控制的DAC输出 SCI串口232通信

    文章目录 前言 1 SCIA FIFO 串口通信配置 2 DAC 数模转换 配置 2.1 TLV5620芯片简介 2.2 TLV5620初始化函数 2.2 DAC 输出函数 3 ADC 模数转换 配置 ...

  2. TI DSP 28335 ePWM实现单路带死区PWM

    文章目录 前言 1 PWM简介 2 死区简介 3 ePWM模块结构原理图 4 PWM 输出配置步骤:EPWM1_Init() 4.1 使能ePWM外设时钟,失能时间基准TB时钟 4.2 ePWM I/ ...

  3. TI DSP 28335 SCI FIFO中断 串口232通信

    文章目录 前言 1 SCIA FIFO 串口通信配置步骤 1.1 使能SCIA外设时钟 1.2 初始化SCIA对应GPIO 1.3 SCI工作方式 1.3.1 数据格式 1.3.2 波特率 1.3.3 ...

  4. TI DSP 28335 看门狗(WatchDog)及通过看门狗实现中断

    文章目录 前言 1 看门狗(监控芯片) 2 相关寄存器 2.1 WDCR看门狗控制寄存器 2.2 WDCNTR看门狗计数器寄存器 2.3 WDKEY看门狗复位寄存器 2.4 SCSR系统控制和状态寄存 ...

  5. TI DSP BootLoader技术要点概述

    概述 在开发一款产品特别是要装到密闭空间里面的产品的时候,经常要考虑到程序的更新问题,更新程序的方法有使用芯片厂家自带的功能的(通过拉某个引脚,设置芯片启动某块boot程序,然后引导将自己的程序下载进 ...

  6. Simulink嵌入式自动代码生成DSP 28335/28035/28x系列 (1)——官方例程(1)讲解 {ADC-PWM同步中断}

    前言 本人了解到电动汽车中 OBC和 DCDC 普遍使用TI (德州仪器)DSP 28335和 28035系列芯片 做开关电源控制,电源领域的 工程师 需要对于芯片的配置和 配套软件Code Comp ...

  7. dsp28335读地址c语言写法,dsp 28335 教程 附录4 dsp的c语言.ppt

    您所在位置:网站首页 > 海量文档 &nbsp>&nbsp计算机&nbsp>&nbsp嵌入式开发 dsp 28335 教程 附录4 dsp的c语言.p ...

  8. TI DSP入门学习

    本FAQ是针对刚刚进入DSP硬件和软件设计领域的网友,希望能够帮助大家快速入门.在设计和调试时少走弯路. 水平有错误和不完善的地方,大家一定指出,免得流毒无穷.欢迎大家补充!! 1.TI DSP的选型 ...

  9. TI DSP 6657 SRIO 简介

    TI DSP 6657 SRIO 简介 SRIO 协议介绍 TI 的 KeyStone 系列设备中实现了 RapidIO 协议,实现 RapidIO 的部分外设,被 TI 称为 SRIO (Seria ...

  10. 三相PFC程序30KW充电桩 采用目前最常用的TI DSP数字信号处理芯片

    三相PFC程序30KW充电桩的5001000Vdc/060A,绝对与实物一致的30KW三相PFC程序. 一.在技术指标参数中,都可以满足 二.文件资料包括: 1.原理图,AltiumDesigner1 ...

最新文章

  1. 对我国6G早期研究布局的几点建议
  2. Typescript + TSLint + webpack 搭建 Typescript 的开发环境
  3. VC内存泄露检查工具:Visual Leak Detector
  4. mac下将python2.7改为python3
  5. 二分法01:查找一个数
  6. R语言基础 训练营公告
  7. WinForm 使用 HttpUtility
  8. 全球最快!湖南大学天河超算存储系统!
  9. codemirror实现SQL代码自动提示功能
  10. [Google] 再见 SharedPreferences 拥抱 Jetpack DataStore
  11. 汽车EE架构 发展过程
  12. 北上杭是梦!“郑福贵”才是中国智慧城市的真相
  13. 中英文金额大写转换器
  14. 面试官说:Spring这几个问题你回答下,月薪3万,下周来上班!
  15. vscode怎样修改切换自动换行的快捷键
  16. Docker 配置阿里云加速
  17. 有哪些中西合璧的建筑设计?
  18. 游戏平台搭建在韩国大带宽服务器CN2路线哪里的比较好
  19. Linux 安装红帽 RHEL 8 详细图文教程
  20. Windows认证原理

热门文章

  1. 恭主驾到:最新的汽车年审新规,都了解了吗?
  2. A fastandrobust convolutionalneuralnetwork-based defect detection model inproductqualitycontrol-阅读笔记
  3. AI-语音处理理论与应用-语音处理简介
  4. 用计算机算出身高,身高预测公式计算器靠谱吗
  5. 新浪短网址api接口——5个可生成新浪t.cn短链的在线工具网站评测
  6. 猫和计算机连接网络,宽带猫和路由器怎样连接 宽带猫和路由器连接方法【教程】...
  7. win7如何设置wifi热点_博世壁挂炉“盖世7200i”WiFi功能如何设置
  8. 物联网数据多又杂?好用的数据可视化服务来了
  9. 20171028_艾孜_Java_第二次
  10. python描述对象静态特性的数据为_对于需要几个单位共同负担的一张原始凭证上的支出,应根据其他单位负担部分为其提高( )。...