TI DSP 28335 eCAP 测量脉冲占空比
文章目录
- 前言
- 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
频率TBCLK
为75MHz
(SYSCLKOUT/2
),占空比50%
(即占(PWM3_TIMER_MAX +1)/TBCLK
),周期T
为2*(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
频率TBCLK
为75MHz
(SYSCLKOUT/2
),高、低电平各占50%
,即占(PWM3_TIMER_MAX +1)/TBCLK
,在该例为
Ton=Toff=(PWM3_TIMER_MAX +1)/TBCLK=(8000+1)/75
eCAP并未分频,其计数器频率为为150MHz
(SYSCLKOUT
),对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 测量脉冲占空比相关推荐
- TI DSP 28335 ADC连续采样检测SPI控制的DAC输出 SCI串口232通信
文章目录 前言 1 SCIA FIFO 串口通信配置 2 DAC 数模转换 配置 2.1 TLV5620芯片简介 2.2 TLV5620初始化函数 2.2 DAC 输出函数 3 ADC 模数转换 配置 ...
- TI DSP 28335 ePWM实现单路带死区PWM
文章目录 前言 1 PWM简介 2 死区简介 3 ePWM模块结构原理图 4 PWM 输出配置步骤:EPWM1_Init() 4.1 使能ePWM外设时钟,失能时间基准TB时钟 4.2 ePWM I/ ...
- 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 ...
- TI DSP 28335 看门狗(WatchDog)及通过看门狗实现中断
文章目录 前言 1 看门狗(监控芯片) 2 相关寄存器 2.1 WDCR看门狗控制寄存器 2.2 WDCNTR看门狗计数器寄存器 2.3 WDKEY看门狗复位寄存器 2.4 SCSR系统控制和状态寄存 ...
- TI DSP BootLoader技术要点概述
概述 在开发一款产品特别是要装到密闭空间里面的产品的时候,经常要考虑到程序的更新问题,更新程序的方法有使用芯片厂家自带的功能的(通过拉某个引脚,设置芯片启动某块boot程序,然后引导将自己的程序下载进 ...
- Simulink嵌入式自动代码生成DSP 28335/28035/28x系列 (1)——官方例程(1)讲解 {ADC-PWM同步中断}
前言 本人了解到电动汽车中 OBC和 DCDC 普遍使用TI (德州仪器)DSP 28335和 28035系列芯片 做开关电源控制,电源领域的 工程师 需要对于芯片的配置和 配套软件Code Comp ...
- dsp28335读地址c语言写法,dsp 28335 教程 附录4 dsp的c语言.ppt
您所在位置:网站首页 > 海量文档  > 计算机 > 嵌入式开发 dsp 28335 教程 附录4 dsp的c语言.p ...
- TI DSP入门学习
本FAQ是针对刚刚进入DSP硬件和软件设计领域的网友,希望能够帮助大家快速入门.在设计和调试时少走弯路. 水平有错误和不完善的地方,大家一定指出,免得流毒无穷.欢迎大家补充!! 1.TI DSP的选型 ...
- TI DSP 6657 SRIO 简介
TI DSP 6657 SRIO 简介 SRIO 协议介绍 TI 的 KeyStone 系列设备中实现了 RapidIO 协议,实现 RapidIO 的部分外设,被 TI 称为 SRIO (Seria ...
- 三相PFC程序30KW充电桩 采用目前最常用的TI DSP数字信号处理芯片
三相PFC程序30KW充电桩的5001000Vdc/060A,绝对与实物一致的30KW三相PFC程序. 一.在技术指标参数中,都可以满足 二.文件资料包括: 1.原理图,AltiumDesigner1 ...
最新文章
- 对我国6G早期研究布局的几点建议
- Typescript + TSLint + webpack 搭建 Typescript 的开发环境
- VC内存泄露检查工具:Visual Leak Detector
- mac下将python2.7改为python3
- 二分法01:查找一个数
- R语言基础 训练营公告
- WinForm 使用 HttpUtility
- 全球最快!湖南大学天河超算存储系统!
- codemirror实现SQL代码自动提示功能
- [Google] 再见 SharedPreferences 拥抱 Jetpack DataStore
- 汽车EE架构 发展过程
- 北上杭是梦!“郑福贵”才是中国智慧城市的真相
- 中英文金额大写转换器
- 面试官说:Spring这几个问题你回答下,月薪3万,下周来上班!
- vscode怎样修改切换自动换行的快捷键
- Docker 配置阿里云加速
- 有哪些中西合璧的建筑设计?
- 游戏平台搭建在韩国大带宽服务器CN2路线哪里的比较好
- Linux 安装红帽 RHEL 8 详细图文教程
- Windows认证原理
热门文章
- 恭主驾到:最新的汽车年审新规,都了解了吗?
- A fastandrobust convolutionalneuralnetwork-based defect detection model inproductqualitycontrol-阅读笔记
- AI-语音处理理论与应用-语音处理简介
- 用计算机算出身高,身高预测公式计算器靠谱吗
- 新浪短网址api接口——5个可生成新浪t.cn短链的在线工具网站评测
- 猫和计算机连接网络,宽带猫和路由器怎样连接 宽带猫和路由器连接方法【教程】...
- win7如何设置wifi热点_博世壁挂炉“盖世7200i”WiFi功能如何设置
- 物联网数据多又杂?好用的数据可视化服务来了
- 20171028_艾孜_Java_第二次
- python描述对象静态特性的数据为_对于需要几个单位共同负担的一张原始凭证上的支出,应根据其他单位负担部分为其提高( )。...