工具/软件:Code Composer Studio
大家好!
我的多 SOC 及其结果有问题。
我需要使用12个通道、对于每个通道、我单独使用 SOC。 我从一个通道开始弓箭步,这一点没有问题,所有的工作都很完美。
下一步是为4个通道建立4个 SOC、这里开始出现问题。
通过在通道 A0上提供1.5V 电压、我已经在寄存器 ADCRESULT0和 ADCRESULT1中得到结果(请参阅图像1)。
寄存器 ADCRESULT1 (好的)中通道 A1提供1.5V 电压。
通过在通道 A2处提供1.5V 电压、我完全没有结果、等等。
我已经阅读过10次以上的所有示例、与技术手册相同... 我找不到答案。
原因可能是什么?
谢谢!
图1.
----------------------------------------------------------------------
//############################################################################################################
// ePWM1 100kHz、50%占空比;
// ePWM1B=!ePWM1A;
//去带= 100ns 上升沿+ 100ns 下降沿
// PIN49=ePWM1A PIN51=ePWM1B;
// ADC SOC0、CHSEL0 =引脚09
//############################################################################################################
//包含的文件
//
#include "F28x_Project.h"
//
//定义
//
#define PRD 499 //周期寄存器2499=20kHz 499=100kHz 99=500kHz
#define DB 20 //去带1 = 10nS
#define acqps 14 //采集窗口75ns
//
//全局
//
//
//函数原型
//
void ConfigureADC (void);
void SetupADCepwm (void);
_interrupt void adca1_ISR (void);
void InitEPwm1Examples(void);
_interrupt void epwm1_ISR (void);
//
//主函
//
void main (void)
{
InitSysCtrl();
// InitGpio();
CpuSysRegs.PCLKCR2.bit.EPWM1=1;
InitEPwm1Gpio();
//
//配置 ADC 并为其加电
//
ConfigureADC();
//
//为 ePWM 触发的转换设置 ADC
//
SetupADCepwm();
Dint;
InitPieCtrl();
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable();
EALLOW;//这是写入 EALLOW 受保护寄存器所必需的
PieVectTable.EPWM1_INT =&epwm1_ISR;
PieVectTable.ADCA1_INT =&adca1_ISR;//针对 ADCA 中断1的函数
EDIS;//这是禁止写入 EALLOW 受保护寄存器所必需的
EALLOW;
CpuSysRegs.PCLKCR0.bit.TBCLKSYNC=0;
EDIS;
InitEPwm1Examples();
EALLOW;
CpuSysRegs.PCLKCR0.bit.TBCLKSYNC=1;
EDIS;
IER |= M_INT3;
IER |= M_INT1;//启用组1中断
EINT;//启用全局中断 INTM
ERTM;//启用全局实时中断 DBGM
PieCtrlRegs.PIEIER3.bit.INTx1 = 1;//PWM
PieCtrlRegs.PIEIER1.bit.INTx1 = 1;//ADC
while (1)
{
}//结束时
}//主端
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
空配置 ADC (空)
{
EALLOW;
//
//写入配置
//
AdcaRegs.ADCCTL2.bit.prescale = 6;//将 ADCCLK 分频器设置为/4
AdcSetMode (ADC_ADCA、ADC_resolution_12位、ADC_SIGNALMODE_SINGLE);
//
//将脉冲位置设置为晚期
//
AdcaRegs.ADCCTL1.bit.INTPULSEPOS=1;
//
//为 ADC 加电
//
AdcaRegs.ADCCTL1.bit.ADCPWDNZ = 1;
//
//延迟1ms 以允许 ADC 加电时间
//
DELAY_US (1000);
EDIS;
}
void SetupADCepwm (void)
{
//
//选择要转换的通道和转换结束标志
//
EALLOW;
AdcaRegs.ADCSOC0CTL.bit.CHSEL = 0;//SOC0将转换引脚 A0
AdcaRegs.ADCSOC1CTL.bit.CHSEL = 1;//SOC1将转换引脚 A1
AdcaRegs.ADCSOC2CTL.bit.CHSEL = 2;//SOC2将转换引脚 A2
AdcaRegs.ADCSOC3CTL.bit.CHSEL = 3;//SOC3将转换引脚 A3
AdcaRegs.ADCSOC0CTL.bit.ACQPS = acqps;// 14 = 75ns
AdcaRegs.ADCSOC1CTL.bit.ACQPS = acqps;// 14 = 75ns
AdcaRegs.ADCSOC2CTL.bit.ACQPS = acqps;// 14 = 75ns
AdcaRegs.ADCSOC3CTL.bit.ACQPS = acqps;// 14 = 75ns
AdcaRegs.ADCSOC0CTL.bit.TRIGSEL = 5;// ePWM1 SOCA 上的触发
AdcaRegs.ADCSOC1CTL.bit.TRIGSEL = 5;// ePWM1 SOCA 上的触发
AdcaRegs.ADCSOC2CTL.bit.TRIGSEL = 5;// ePWM1 SOCA 上的触发
AdcaRegs.ADCSOC3CTL.bit.TRIGSEL = 5;// ePWM1 SOCA 上的触发
AdcaRegs.ADCINTSEL1N2.bit.INT1SEL = 3;// SOC3结束将设置 INT1标志
AdcaRegs.ADCINTSEL1N2.bit.INT1E = 1;//启用 INT1标志
AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;//确保 INT1标志被清除
EDIS;
}
//
// adca1_ISR -在 ISR 中读取 ADC 缓冲器
//
_interrupt void adca1_ISR (void)
{
AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;//清除 INT1标志
PieCtrlRegs.PIEACX.ALL = PIEACK_Group1;
}
//
// epwm1_ISR - EPWM1 ISR
//
_interrupt void epwm1_ISR (void)
{
//
//切换 GPIO31 (LED)
//
// GpioDataRegs.GPATOGGLE.bit.GPIO31=1;
//
//清除此计时器的 INT 标志
//
EPwm1Regs.ETCLR.bit.INT = 1;
//
//确认此中断以接收来自组3的更多中断
//
PieCtrlRegs.PIEACX.ALL = PIEACK_Group3;
}
//
// InitEPwm1Example-Initialize EPWM1配置
//
空 InitEPwm1Examples()
{
//
//设置 TBCLK
//
EPwm1Regs.TBPRD = PRD;//设置计时器周期801 TBCLK
EPwm1Regs.TBPHS.bit.TBPHS = 0x0000;//相位为0
EPwm1Regs.TBCTR = 0x0000;//清除计数器
//
//设置比较值
//
EPwm1Regs.CMPA.bit.CMPA = PRD/2;//设置比较 A 值
EPwm1Regs.CMPB.bit.CMPB = 0;//设置比较 B 值
//
//设置计数器模式
//
EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN;//向上和向下计数
EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE;//禁用相位加载
EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;//时钟与 SYSCLKOUT 的比率
EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV1;
//
//设置隐藏
//
EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;
EPwm1Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;//零负载
EPwm1Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;
//
//设置操作
//
EPwm1Regs.AQCTLA.bit.CAU = AQ_SET;//在事件 A 上设置 PWM1A、递增
//计数
EPwm1Regs.AQCTLA.bit.CAD = AQ_CLEAR;//在事件 A 上清除 PWM1A、
//倒计数
EPwm1Regs.AQCTLB.bit.CAU = AQ_CLEAR;//在事件 B 上设置 PWM1B、向上
//计数
EPwm1Regs.AQCTLB.bit.CAD = AQ_SET;//在事件 B 上清除 PWM1B、
//倒计数
//
//低电平有效 PWM -设置死区
//
EPwm1Regs.DBCTL.bit.OUT_MODE = DB_FUL_ENABLE;//启用死区模块
EPwm1Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC;//活动高电平互补
EPwm1Regs.DBCTL.bit.IN_MODE = DBA_ALL;// ePWMxA -上升沿的源、ePWMxB -下降沿的源、
EPwm1Regs.DBFED.bit.DBFED = DB;
EPwm1Regs.DBRED.bit.DBRED = DB;
//
//中断,我们将在其中更改比较值
//
EPwm1Regs.ETSEL.bit.INTSEL = ET_CTR_ZERO;//选择零事件时的 INT
EPwm1Regs.ETSEL.bit.INTEN = 1;//启用 INT
EPwm1Regs.ETPS.bit.INTPRD = et_1st;//在第三个事件发生时生成 INT
EPwm1Regs.ETSEL.bit.SOCAEN = 1;//启用组上的 SOC
EPwm1Regs.ETSEL.bit.SOCASEL = 4;//在递增计数时选择 SOC
EPwm1Regs.ETPS.bit.SOCAPRD = 1;//在发生第一个事件时生成脉冲
}
//
//文件结束
//