主题中讨论的其他器件:SysConfig、 C2000WARE
工具与软件:
尊敬的团队:
如果我使用驱动程序库通过 SysConfig 执行相同操作、则以下 ADC 示例中的代码无法在寄存器配置中正常运行。
请查找 C 代码以供参考
//########################################################################################################################################################################
//
//文件:adc_ex2_epwm_tempsensor.c
//
//标题:采样温度传感器并转换为温度
//
//! \addtogroup bitfield_example_list
//!
ADC 温度传感器转换
//!
//! 此示例将 ePWM 设置为定期触发 ADC。 。
//! ADC 转换到温度传感器的内部连接、
//! 然后、通过调用将其解释为温度
//! GetTemperatureC 函数。
//!
//! 程序运行后、内存将包含:\n
//! -\b sensorSample \b:来自温度传感器的原始读数。 \n
//! -\b sensorTemp \b :传感器样本的解释为 a
//! 单位为摄氏度。
//!
//
//############################################################################################################################################################################################
//
//
//
// C2000Ware v5.04.00.00
//
//版权所有(C) 2024德州仪器(TI)公司- http://www.ti.com
//
//以源代码和二进制形式重新分发和使用、无论有无
//修改、但前提是满足以下条件
//已满足:
//
//重新分发源代码必须保留上述版权
//通知、此条件列表和以下免责声明。
//
//以二进制形式重新分发必须复制上述版权
//通知、此条件列表和中的以下免责声明
//随提供的文档和/或其他材料
//分布。
//
//既不是德州仪器(TI)公司的名称、也不是的名称
//其贡献者可用于认可或推广衍生产品
//未经事先书面许可、从本软件中获取。
//
//此软件由版权所有者和贡献者提供
//"按原样"以及任何明示或暗示的保证、包括但不包括
//仅限于对适销性和适用性的暗示保证
//不考虑特定目的。 在任何情况下均不得享有版权
//所有者或贡献者对任何直接、间接、附带、
//特殊、示例性或后果性损害(包括但不包括)
/仅限于采购替代商品或服务;不使用、
//数据或利润;或业务中断)、无论其原因是什么
//责任理论,无论是合同,严格责任,或侵权
//(包括疏忽或其他)以任何方式产生的使用
//此软件、即使被告知此类损坏的可能性。
//$
//############################################################################################################################################################################################
//
//包含的文件
//
#include "F28x_PROJECT.h"
//
//定义
//
#define results_buffer_size 256
//
// Globals (全局变量)
//
uint16_t sensorSample = 0;
uint16_t isrCount = 0;
int16_t sensorTemp = 0;
//
//函数原型
//
void initADC (void);
void initEPWM (void);
void initADCSOC (void);
__interrupt void adcC1ISR (void);
//
// Main (主菜单)
//
void main (void)
{
//
//初始化器件时钟和外设
//
InitSysCtrl();
//
//初始化 GPIO
//
InitGpio();
//
//禁用 CPU 中断
//
颜色;
//
//将 PIE 控制寄存器初始化为默认状态。
//默认状态是禁用所有 PIE 中断并显示标志
//被清除。
//
InitPieCtrl();
//
//禁用 CPU 中断并清除所有 CPU 中断标志:
//
IER = 0x0000;
IFR = 0x0000;
//
//使用指向 shell 中断的指针初始化 PIE 矢量表
//服务例程(ISR)。
//
InitPieVectTable();
//
//映射 ISR 函数
//
EALLOW;
PieVectTable.ADCC1_INT =&adcC1ISR;// ADCC 中断1的函数
EDIS;
//
//配置 ADC 并为其上电
//
initADC();
//
//配置 ePWM
//
initEPWM();
//
//将 ADC 设置为通道1上的 EPWM 触发转换
//
initADCSOC();
EALLOW;
//
//启用 PIE 中断
//
PieCtrlRegs.PIEIER1.bit.INTx3 = 1;
//
//同步 ePWM
//
CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 1;
//
//启用全局中断和更高优先级的实时调试事件:
//
IER |= M_INT1;//启用组1中断
EINT;//启用全局中断 INTM
erTM;//启用全局实时中断 DBGM
InitTempSensor (3.3f);
//
//启动 ePWM
//
EPwm1Regs.ETSEL.bit.SOCAEN = 1;// Enable SOCA
EPwm1Regs.TBCTL.bit.CTRMODE = 0;//解冻、并进入递增计数模式
//
//等待 ePWM 会引起 ADC 转换、然后导致中断、
//这将填充结果缓冲区、最终设置 bufferFull
//标记
//
while (1)
{
}
}
//
// initADC -用于配置 ADCC 并为其加电的函数。
//
void initADC (void)
{
//
//将 VREF 设置为内部
//
SetVREF (ADC_ADCC、ADC_INTERNAL、ADC_VREF3P3);
EALLOW;
//
//将 ADCCLK 分频器设置为/4
//
AdccRegs.ADCCTL2.bit.prescale = 6;
//
//将脉冲位置设置为延迟 EOC
//
AdccRegs.ADCCTL1.bit.INTPULSEPOS = 1;
//
//给 ADC 上电、然后延迟1 ms
//
AdccRegs.ADCCTL1.bit.ADCPWDNZ = 1;
EDIS;
DELAY_US (1000);
}
//
// initEPWM -用于配置 ePWM1以生成 SOC 的函数。
//
void initEPWM (void)
{
EALLOW;
EPwm1Regs.ETSEL.bit.SOCAEN = 0;// Disable SOC on a group (禁用组上的 SOC)
EPwm1Regs.ETSEL.bit.SOCASEL = 4;//在向上计数时选择 SOC
EPwm1Regs.ETPS.bit.SOCAPRD = 1;//在发生第1个事件时生成脉冲
EPwm1Regs.CMPA.bit.CMPA = 0x0800;//设置将 A 值与2048个计数进行比较
EPwm1Regs.TBPRD = 0x1000;//将周期设置为4096个计数
EPwm1Regs.TBCTL.bit.CTRMODE = 3;//冻结计数器
EDIS;
}
//
// initADCSOC -用于将 ADCA 的 SOC0配置为由 ePWM1触发的函数。
//
void initADCSOC (void)
{
//
//选择要转换的通道以及转换结束标志
//
EALLOW;
AdccRegs.ADCSOC0CTL.bit.CHSEL = 0xC;// SOC0将转换引脚 C12
AdccRegs.ADCSOC0CTL.bit.ACQPS = 45;//采样窗口为10个 SYSCLK 周期
AdccRegs.ADCSOC0CTL.bit.TRIGSEL = 5;// Trigger on ePWM1 SOCA
AdccRegs.ADCINTSEL1N2.bit.INT1SEL = 0;// SOC0 end of SOC0将设置 INT1标志
AdccRegs.ADCINTSEL1N2.bit.INT1E = 1;// Enable INT1 flag (启用 INT1标志)
AdccRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;//确保 INT1标志被清除
EDIS;
}
//
// adcC1ISR - ADC C 中断1 ISR
//
__interrupt void adcC1ISR (void)
{
isrCount++;
//
//将最新结果添加到缓冲区
// ADCRESULT0是 SOC0的结果寄存器
sensorSample = AdccResultRegs.ADCRESULT0;
sensorTemp = GetTemperatureC (sensorSample);
//
//清除中断标志
//
AdccRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;
//
//检查是否发生了溢出
//
if (1 = AdccRegs.ADCINTOVF.bit.ADCINT1)
{
AdccRegs.ADCINTOVFCLR.bit.ADCINT1 = 1;// Clear INT1 overflow flag flag (ADccRegs.ADCINTOVFCLR.bit.ADCINT1 = 1)
AdccRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;// Clear INT1 flag (清除 INT1标志)
}
//
//确认中断
//
PieCtrlRegs.PIEACK.all = PIEACK_Group1;
}
//
//文件结尾
//