基于28035的ePWM触发ADC采样设计

2023-05-16

目录

    • 前言
    • 实验目的
    • 实验要求
    • 硬件电路
    • 实验步骤
    • 代码解释
    • 实验结果
    • 总结
    • 体会

前言

玖道最近在做一个开关电源项目,需要用到TI 的TMS320F28035 芯片,实现控制电路的设计。简单来说就是利用28035采集信号量,经过算法计算,得到占空比,然后利用ePWM模块输出PWM波来控制功率开关管的导通和关断,从而实现拓扑的功率变换。

为了实现控制,我们需要在一个开关周期(PWM周期)内实现ADC采样,占空比计算等。那么,如何实现在每个开关周期内进行ADC采样呢?

答案是利用ePWM模块在每个PWM周期内去触发ADC模块进行采样,那究竟如何配置实现?

这就是本文要讲的主题了~

实验目的

通过ePWM模块和ADC模块,实现ePWM在每个PWM周期内发出SOC(start of conversion)信号,触发ADC进行采样,以此深入理解两个模块的工作原理与配置细节。

实验要求

如下图所示,通过ePWM模块产生固定频率和占空比的PWM信号,并在每个PWM周期开始处进行采样,即采样频率等于PWM频率。

在这里插入图片描述

硬件电路

如下图所示,ADC通过RG引脚采样可调电阻的电压值,并保存在结果寄存器ADCRESULT中。跳线帽短接3-5脚,可变电阻的电压值通过RGADIN0B相连,即ADC可通过ADIN0B对可变电阻值进行采样。这里的ADIN0B指的是ADC 16路复用输入通道中的GROUP B channel 0。具体如下图所示。
在这里插入图片描述
引脚
在这里插入图片描述
在这里插入图片描述
注意,ADCINB0就是一个ADC输入采样引脚,并不是通过GPIO进行复用的,所以并不需要配置GPIO,直接使用就行。

实验步骤

在这里插入图片描述
整个系统的程序流程图,大致如上图所示。

首先,是DSP系统的一些初始化操作,包括锁相环,看门狗,外设时钟使能,关闭中断,初始化PIE中断向量表等。

其次,就是配置EPWM模块,产生固定频率和占空比的PWM,并设置触发EPWMxSOCA(或EPWMxSOCB,这里选择EPWMxSOCA)信号。

然后,ADC模块配置采样输入通道触发源(接收EPWMxSOCA),采样窗的大小,并选择某个SOCx(x:0-15,这里选择SOC1)进行ADC转换和触发中断ADCINTx(x:1-9)

最后,就是进入循环,进行喂狗,显示等其他后台操作。发生ADC中断时,进入ADC中断服务函数,取出可变电阻采样值并保存到数组中。

大致流程就是这样,当然读懂的前提是充分了解28035的EPWM模块和ADC模块,即熟读TI官方的用户手册和数据手册。

另外,这里面还有很多细节,未曾提及,主要还是参考官方例程和芯片手册,然后结合需求进行修改。

代码解释


#include "DSP28x_Project.h"     // Device Header file and Examples Include File

// Prototype statements for functions found within this file.
__interrupt void adc_isr(void);   

// Global variables used in this example:
Uint16 ConversionCount;   
Uint16 Voltage1[10];

int main()
{
// Step 1. Initialize System Control:
// PLL, WatchDog, enable Peripheral Clocks
// This example function is found in the DSP2803x_SysCtrl.c file.
   InitSysCtrl();

// Step 2. Initialize GPIO:
// This example function is found in the DSP2803x_Gpio.c file and
// illustrates how to set the GPIO to it's default state.
// InitGpio();  // Skipped for this example

// 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 DSP2803x_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 DSP2803x_DefaultIsr.c.
// This function is found in DSP2803x_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 register
   PieVectTable.ADCINT1 = &adc_isr;
   EDIS;    // This is needed to disable write to EALLOW protected registers

// Step 4. Initialize all the Device Peripherals:
   InitAdc();  // For this example, initialize the ADC
   AdcOffsetSelfCal();

// Step 5. User specific code, enable interrupts:

// Enable ADCINT1 in PIE
   PieCtrlRegs.PIEIER1.bit.INTx1 = 1;   // Enable INT 1.1 in the PIE for ADCINT1
   IER |= M_INT1;                       // Enable CPU Interrupt 1
   EINT;                                // Enable Global interrupt INTM
   ERTM;                                // Enable Global real time interrupt DBGM

   ConversionCount = 0;

// Configure ADC
// Note: Channel ADCINB0  will be double sampled to workaround the ADC 1st sample issue for rev0 silicon errata

   EALLOW;
   AdcRegs.ADCCTL1.bit.INTPULSEPOS  = 1;    //ADCINT1 trips after AdcResults latch
   AdcRegs.INTSEL1N2.bit.INT1E      = 1;    //Enabled ADCINT1
   AdcRegs.INTSEL1N2.bit.INT1CONT   = 0;    //Disable ADCINT1 Continuous mode
   AdcRegs.INTSEL1N2.bit.INT1SEL    = 1;    //setup EOC1 to trigger ADCINT1 to fire
   AdcRegs.ADCSOC0CTL.bit.CHSEL     = 8;    //set SOC0 channel select to ADCINB0(dummy sample for rev0 errata workaround)
   AdcRegs.ADCSOC1CTL.bit.CHSEL     = 8;    //set SOC1 channel select to ADCINB0
   AdcRegs.ADCSOC0CTL.bit.TRIGSEL   = 5;    //set SOC0 start trigger on EPWM1A, due to round-robin SOC0 converts first then SOC1
   AdcRegs.ADCSOC1CTL.bit.TRIGSEL   = 5;    //set SOC1 start trigger on EPWM1A, due to round-robin SOC0 converts first then SOC1
   AdcRegs.ADCSOC0CTL.bit.ACQPS     = 6;    //set SOC0 S/H Window to 7 ADC Clock Cycles, (6 ACQPS plus 1)
   AdcRegs.ADCSOC1CTL.bit.ACQPS     = 6;    //set SOC1 S/H Window to 7 ADC Clock Cycles, (6 ACQPS plus 1)
   EDIS;

// Assumes ePWM1 clock is already enabled in InitSysCtrl();
   EPwm1Regs.ETSEL.bit.SOCAEN   = 1;        // Enable SOC on A group
   EPwm1Regs.ETSEL.bit.SOCASEL  = 1;        // generate SOCx when TBCTR = ZERO
   EPwm1Regs.ETPS.bit.SOCAPRD   = 1;        // Generate pulse on 1st event
   EPwm1Regs.CMPA.half.CMPA     = 0x0080;   // Set compare A value
   EPwm1Regs.TBPRD              = 0xFFFF;   // Set period for ePWM1
   EPwm1Regs.TBCTL.bit.CTRMODE  = 0;        // count up and start

// Wait for ADC interrupt
   for(;;)
   {
   }
}

__interrupt void  adc_isr(void)
{
  Voltage1[ConversionCount] = AdcResult.ADCRESULT1; //discard ADCRESULT0 as part of the workaround to the 1st sample errata for rev0
  // If 20 conversions have been logged, start over
  if(ConversionCount == 9)
  {
     ConversionCount = 0;
  }
  else
  {
      ConversionCount++;
  }

  AdcRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;     // Clear ADCINT1 flag reinitialize for next SOC
  PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;   // Acknowledge interrupt to PIE

  return;
}

实验结果

编辑好代码后,烧录到芯片中,然后Debug,全速运行,通过窗口[Window->show view->expression]添加采样值。可以看到,10个采样值在实时进行刷新,即实现了PWM触发ADC周期性采样。
在这里插入图片描述

总结

本文简单介绍了利用TMS320F28035的EPWM模块产生SOC信号,以此触发ADC模块进行采样的大致设计思路及流程,并结合官方例程给出相应代码和实验结果,其中并未详细讲述EPWM模块和ADC模块相关寄存器的具体配置过程,读者可参考TI官方手册:

  • 2803x Piccolo Technical Reference Manual.pdf
  • tms320f28035.pdf

体会

笔者认为学习DSP最好的方式就是:官方例程+数据手册+用户手册+开发板+CCS。

具体来讲呢,官方例程可以给我们提供一个程序正确的整体架构,比如一些初始化步骤,先初始化哪部分,然后再初始化哪部分,最后再怎么样。

数据手册+用户手册可以说是最重要的资料了,必须要反复研读英文原版(记住是英文版,中文版可能会有很多翻译错误,笔者踩过坑),而且最好是结合代码研读,并做好笔记,方便以后复习。

配合数据手册和用户手册将官方例程看懂之后,就可以进行自己的一些配置了,从底层新建工程,一步一步编写自己的代码,然后结合CCS+开发板进行调试。

调试代码的时间可能是编写代码所费时间的数倍不止,因为程序会有很多Bug,这个时候就要结合数据手册和用户手册,对代码进行一行一行的检查,弄懂每一行代码的作用,思考逻辑或寄存器配置是否错误。

当你从头到尾,成功完成一个小实验,实现理论到实验验证的闭环,相信你的能力和信心会提高不少。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于28035的ePWM触发ADC采样设计 的相关文章

  • 小松的STM32教程(6)——ADC

    预备 学习目标 学会调用Get Adc Average函数会使能多个ADC通道 概述 ADC输入电压范围 xff1a 2 4V 3 6V xff0c 一般使用0V和3 3V 数据对齐 xff1a 16bit存放12bit的转换数据 xff0
  • nRF52832芯片使用ADC的代码示例

    nRF52832芯片使用ADC的代码示例 define ADC REF VOLTAGE IN MILLIVOLTS 600 lt Reference voltage in millivolts used by ADC while doing
  • ADC 采样数据抖动

    MSP430或STM32 xff0c 在使用内部ADC出现的采样数据异常抖动问题 采样设计 xff1a 用于检测供电线路电流及电压 产品运行在两种模式下 xff0c 1 低功耗静态模式 xff08 仓储态 xff09 xff0c 2 全功能
  • ADC采样滤波算法利用卡尔曼滤波算法详解

    1 ADC采样模型 xff08 本文为笔者早期所写 xff0c 当时对卡尔曼滤波器理解尚未透彻 xff0c 如今回顾 xff0c 该模型还有所缺陷 xff0c 推荐读者看卡尔曼的推导过程或者B站大佬Dr CAN的空间 xff09 假设ADC
  • STM32H7A3 ADC+DMA使用问题

    问题1 xff1a DMA采用半字传输16位ADC值 xff0c 用于存储ADC数据的数组一定是采集数的两倍 xff0c 否则会产生ADC溢出的错误中断HAL ADC ErrorCallback xff0c 从而无法进入ADC采集完成中断H
  • STM32——ADC采集

    目录 ADC简介 ADC主要特征 ADC功能框图 ADC引脚 电压输入范围 通道选择 单次转换模式 连续转换模式 转换顺序 规则序列 注入序列 触发源 转换时间 中断 转换结束中断 模拟看门狗中断 DMA请求 代码讲解 宏定义 xff1a
  • 光敏,红外,人体红外检测模块的模拟输出(ADC)实验——入门

    前面给大家介绍了传感器的开关输出的使用 xff0c 今天给大家介绍一下常见传感器的模拟输出的用法 xff0c 用到了STM32的ADC xff08 模数转换 xff09 模块和USART串口通信模块 代码就是正点原子的ADC实验的代码 今天
  • 【干货】STM32通过ADC模拟看门狗实现掉电保存

    1 前言 很多时候我们需要将程序中的一些参数 数据等存储在EEPROM或者Flash中 xff0c 达到掉电保存的目的 但有些情况下 xff0c 程序需要频繁的修改这些参数 xff0c 如果每次修改参数都进行一次保存 xff0c 那将大大降
  • MSP432(Keil5)——9.ADC驱动

    本次例程驱动了板载的ADC来读取一个模拟的角度传感器 xff0c 大家可以在ADC读取中断里面换成其他的计算 xff0c 具体引脚见程序代码 adc c span class token macro property span class
  • 模数转换ADC模块

    通用基础知识 ADC模块是嵌入式应用中重要的组成部分 xff0c 是嵌入式系统与外界连接的纽带 xff0c 是在测控系统中的重要内容 ADC模块 xff1a 即模数转换模块 AD转换模块 xff0c 功能是将电压信号转换为相应的数字信号 实
  • STM32 进阶教程 18 – ADC间断模式

    前言 STM32 的ADC拥有连续扫描模式 也有间断模式 间断模式较扫描模式需要更多的触发事件才能完成所有的通道转换操作 在实际工程应用中 可以利用间断模式实现一些特殊应用 关于间断模式 在STM32的数据手册中有如下描述 本节将给大家展示
  • 【STM32】HAL库——ADC

    前期准备 STM32CubeMX STM32RCT6核心板 IDE Keil MDK ARM STM32CubeMX部分 1 配置时钟 选择STM32F103RCTx系列芯片 配置时钟的同时会自动配置IO口引脚 将HCLK设置为最大频率72
  • 48脚STM32内部基准电压校准ADC的一些心得记录

    STM32的48脚的单片机因为没有Vref Vref 所以我们使用一些高精度参考电压芯片来提高ADC的精度很不方便 这里还有一种方法可以参考下 STM32内部有一个专门用于校准的稳压器VREFINT 它由外部的VSSA供电 他的电压一般为1
  • Integral nonlinearity (INL) and differential nonlinearity (DNL) of data converters

    Syntax s inldnl analog digital range type s inldnl Name Value Description example s inldnl analog digital range type cal
  • STM32学习笔记:adc采样得到的电压值用485发送给pc

    采用adc1的通道10 将采集到的电压值用485发送给PC显示 先上原理图 源代码见附件 这里想说的是几个要注意的问题 1 ad输入的电压经过了R42和R44进行分压 所以pc显示的电压值将会减半 2 采用这个函数进行发送数据的时候 每次都
  • ESP32-C3入门教程 基础篇(一、ADC采样)

    经过前面的折腾 设计好了自己的测试开发板 搭建好了开发环境 然后正式开始进行功能测试了 测试顺序先从简单的开始吧 一步一步来 目录 前言 1 ADC采样示例测试 1 1 DMA连续采样 1 2 单次采样 1 3 测试源码 2 ESP32 C
  • 高速模数转换器(ADC)的INL/DNL测量

    摘要 尽管积分非线性和微分非线性不是高速 高动态性能数据转换器最重要的参数 但在高分辨率成像应用中却具有重要意义 本文简要回顾了这两个参数的定义 并给出了两种不同但常用的测量高速模数转换器 ADC 的INL DNL的方法 近期 许多厂商推出
  • 栅压自举采样电路(bootstrap技术)

    栅压自举采样电路 bootstrap技术 参考 CMOS模 数转换器设计与仿真 编著 张锋 陈铖颖 范军 文章目录 栅压自举采样电路 bootstrap技术 一 电路结构 二 工作原理 一 电路结构 二 工作原理
  • GD32F4xx MCU ADC+DMA 多通道采样

    1 GD32F4xx ADC GD32F4xx 的12位ADC是一种采用逐次逼近方式的模拟数字转换器 1 1 主要特征 可配置12位 10位 8位 6位分辨率 ADC采样率 12位分辨率为2 6MSPs 10位分辨率为3 0 MSPs 分辨
  • 使用 STM32F0 ADC 单独读取不同的输入

    STM32F072CBU 微控制器 我有多个 ADC 输入 并且希望单独读取它们 STMcubeMX 生成样板代码 假设我希望按顺序读取所有输入 但我无法弄清楚如何纠正这个问题 这篇博文 http blog koepi info 2015

随机推荐

  • 模2除法(CRC冗余码计算)和二进制/十进制除法

    文章目录 CRC循环冗余检验 xff1a 余数为0就没出错 xff1b 不能确定哪几个比特出错了二进制除法 xff08 和十进制除法其实一样 xff01 xff09 模2除法 xff08 不同于二进制除法 xff01 本质就是异或而已 xf
  • latex超链接Argument of \Hy@setref@link has an extra }.错误解决

    用了 usepackage url 来在文章中写了超链接 xff0c 如 url https www baidu com 但是直接编译后没有颜色 xff0c 就是黑色的 xff0c 参考文献也是黑色的 加入下面两句代码可以让超链接显示出颜色
  • 希捷移动硬盘更换文件系统(exfat vs NTFS)

    毕业资料多 xff0c 专门买了个移动硬盘 xff0c 希捷的 2T 第一次买移动硬盘 xff0c 以为和常规U盘一样 xff0c 买来没仔细看说明书就直接用上了 xff0c 但是使用过程中老出问题 xff0c 比如从featurize平台
  • LPWAN——Sigfox实战经验介绍

    0 序 最近半年的时间一直在从事这方面的开发工作 xff0c 到目前为止对于Sigfox有一定想法和经验 xff0c 同时目前国内对于该技术的使用和应用还处在刚刚起步的阶段 xff0c 很多博客对Sigfox的讲解是一个浅尝辄止的介绍 xf
  • 拉格朗日乘子法详解(Lagrange multiplier)

    最近在视频的变换编码里推导最优变换 xff08 KL变换 xff09 时需要用拉格朗日乘子法 xff0c 之前在机器学习的各种优化问题里也要用到这个方法 xff0c 特此仔细钻研一番 xff0c 总结如下 xff1a 注 xff1a 这篇博
  • MATLAB求解规划问题(线性规划, 整数规划, 非线性规划)

    文章目录 基础知识规划问题的数学模型的三个要素解 线性规划Linear Programing理论示例 整数规划理论示例 非线性规划理论示例 生产实践中 xff0c 经常会遇到很多资源分配的问题 xff0c 如何分配各种资源以获得最大经济效益
  • matlab画三维图像(plot3,mesh,surf)

    二维函数的图像必须用三维坐标系画 xff0c 很多函数的图像长得很好看 xff0c 很有意思 会可视化也会有利于我们理解更深刻 xff08 1 xff09 plot3 三维曲线图 在网上看到这图觉得挺好看 xff1a t 61 0 pi 3
  • 智能小车学习笔记

    教程 视频教程 xff1b 资源网站 xff1b 可以获取模块的基础资料 xff1b 有刷电机有损耗 电机选型考虑 xff1a 转速和额定电压 xff1b 电机的力矩 xff0c 减速电机减速箱的作用 xff1a 减速 增大力矩 xff08
  • C++ 容器详解

    顺序容器vectorlistdequestackqueuepriority queue 关联容器mapmultimapsetmultiset 无序容器容器的互相比较迭代器 顺序容器 顺序容器类型特点vector可变大小数组支持快速随机访问
  • Cmake入门&运行保存C/C++文件

    Cmake入门 amp 运行保存C C 43 43 文件 在ubuntu创建 保存 运行c 43 43 文件CMake入门创建文件编译 参考 最近在学习Intel realsense T265双目视觉 xff0c 其中一步需要创建源文件ma
  • NVIDIA Jetson TX2 上手指南

    文章目录 一个性能强大的边缘设备我和 NVIDIA Jetson TX2 的初体验Fresh Your TX2为什么在第一步取消Host Machine可能遇到的问题 用上最好的性能 xff0c 小风扇跳舞吧 xff5e xff5e 运行一
  • extern "C"的作用以及为什么要使用extern "C"

    实现c 43 43 代码能够调用其他c语言代码 xff0c 加上extern 34 C 34 后 xff0c 这部分代码编译器以c语言的方式进行编译和链接 xff0c 而不是按c 43 43 方式原因 xff1a c和c 43 43 对同一
  • 什么是链表?(图解)

    一 xff1a 链表是什么 1 链表是物理存储单元上非连续的 非顺序的存储结构 xff0c 数据元素的逻辑顺序是通过链表的指针地址实现 xff0c 有一系列结点 xff08 地址 xff09 组成 xff0c 结点可动态的生成 2 结点包括
  • C++ STL各个容器的区别

    1 STL容器分类 xff1a STL的容器可以分为以下几个大类 一 顺序 xff08 序列 xff09 容器 xff0c 有vector list deque string stack 适配器类 queue 适配器类 priority q
  • Bat脚本-编译及烧录keil-MDK工程

    目录 概述背景需求需求分析需求实现实现功能使用示例1 修改脚本中的编译软件路径2 将脚本的文件路径加入系统的环境变量3 通过Vscode 进行调用 可进一步优化的方向总结 概述 本文主要讲述的是一个关于调用keil MDK的软件编译对应单片
  • ubuntu部署http服务器

    一 安装apache2 sudo apt install y apache2 二 配置环境 默认是80端口 xff0c 防止冲突自定义端口 xff1a 8001 1 修改 etc apache2 ports conf文件j监听端口 List
  • c/c++math.h标准库

    math h数学函数 这个库中所有可用的函数取double参数并返回double的结果 abs 绝对值 acos 反余弦 acosh 反双曲余弦 asin 反正弦 asinh 反双曲正弦 atan2 两个参数的反正切 atan 反正切 at
  • Linux Simulink打不开——unable to run the MATLABWindow application on Linux

    Linux Simulink打不开 unable to run the MATLABWindow application on Linux 解决办法 xff1a 解决办法 xff1a 参考网页 xff1a https www mathwor
  • RTX移植STM32F103,超详细~

    目录 RTX移植前言移植1 创建工程2 配置工程3 添加LED文件4 编写测试代码5 编译烧录 RTX移植 往期回顾 为什么需要RTOS 前言 keil RTX是一款应用广泛的嵌入式RTOS xff0c 具体可见官网 为什么需要RTOS x
  • 基于28035的ePWM触发ADC采样设计

    目录 前言实验目的实验要求硬件电路实验步骤代码解释实验结果总结体会 前言 玖道最近在做一个开关电源项目 xff0c 需要用到TI 的TMS320F28035 芯片 xff0c 实现控制电路的设计 简单来说就是利用28035采集信号量 xff