主题中讨论的其他器件: C2000WARE、 controlSUITE
我正在使用 TMS320F28335微处理器、在我的代码 AdcRegs.ADCCTL1.bit.ADCREFSEL = 0中;
AdcRegs.ADCSOC0CTL.bit.CHSEL = 5;
AdcRegs.ADCSOC0CTL.bit.TRIGSEL = 5;
AdcRegs.ADCSOC0CTL.bit.ACQPS = 6;
CCS 会显示#137 struct "adc_regs"没有字段、请帮我调试、下面是我的全部代码
#include "DSP28x_Project.h"
#include
#include
#include
extern UINT16 RamfuncsLoadStart;
extern UINT16 RamfuncsLoadSize;
extern UINT16 RamfuncsLoadEnd;
外部 UINT16 RamfuncsRunStart;
void InitEPwm1Example (void);
void InitEPwmTimer (void);
空 Debun (无符号短整型计数);
//针对此文件中的函数的 prototype 语句。
INT V0 = 0;
__interrupt void epwm1_timer_ISR (void);
#define PWM1_INT_ENABLE 1.
#define PWM2_INT_ENABLE 1.
#define PWM3_INT_ENABLE 1.
#define PWM4_INT_ENABLE 1.
#define EPWM1_TIMER_TBPRD 5000 //周期寄存器
#define EPWM1_MAX_CMPA 1200
#define EPWM1_MIN_CMPA 50.
#define EPWM1_MAX_CMPB 600
#define EPWM1_MIN_CMPB 50.
#define EPWM2_TIMER_TBPRD 5000 //周期寄存器
#define EPWM2_MAX_CMPA 1200
#define EPWM2_MIN_CMPA 50.
#define EPWM2_MAX_CMPB 600
#define EPWM2_MIN_CMPB 50.
#define EPWM_CMP_UP 1.
#define EPWM_CMP_DOWN 0
/**
* main.c
*/
int main (空)
{
InitSysCtrl();
InitEPwm1Gpio();
Dint;
InitPieCtrl();
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable();
EALLOW;//写入 EALLOW 保护寄存器需要执行此操作
PieVectTable.EPWM1_INT =&epwm1_timer_isr;
EDIS;//这需要禁用对 EALLOW 保护寄存器的写入
EALLOW;
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0;
EDIS;
InitEPwm1Example();
InitEPwmTimer ();//在本示例中,仅初始化 ePWM 计时器
IER |= M_INT3;
PieCtrlRegs.PIEIER3.bit.intx1 = PWM1_INT_enable;
EALLOW;
GpioCtrlRegs.GPAMUX1.bit.GPIO8 = 0;
GpioCtrlRegs.GPADIR.bit.GPIO8 = 1;
GpioDataRegs.GPACLEAR.bit.GPIO8 = 1;
EDIS;
EALLOW;
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1;//停止所有 TB 时钟
EDIS;
EINT;//启用全局中断 INTM
ERTM;//启用全局实时中断 DBGM
//配置 ADC
EALLOW;
AdcRegs.ADCCTL1.bit.ADCREFSEL = 0;
AdcRegs.ADCSOC0CTL.bit.CHSEL = 5;//将 SOC0通道选择设置为 ADCINA4
// AdcRegs.ADCSOC1CTL.bit.CHSEL = 2;//将 SOC1通道选择设置为 ADCINA2
AdcRegs.ADCSOC0CTL.bit.TRIGSEL = 5;//在 EPWM1A 上设置 SOC0启动触发、由于 SOC0首先循环转换、然后是 SOC1
// AdcRegs.ADCSOC1CTL.bit.TRIGSEL = 5;//在 EPWM1A 上设置 SOC1启动触发、原因是 SOC0先循环转换、然后循环 SOC1
AdcRegs.ADCSOC0CTL.bit.ACQPS = 6;//将 SOC0 S/H 窗口设置为7个 ADC 时钟周期、(6 ACQPS + 1)
// AdcRegs.ADCSOC1CTL.bit.ACQPS = 6;//将 SOC1 S/H 窗口设置为7个 ADC 时钟周期、(6 ACQPS + 1)
EDIS;
memcpy (&RamfuncsRunStart、&RamfuncsLoadStart、(UINT32)&RamfuncsLoadSize);
InitFlash();
InitAdc();
for (;;)
{
EPwm1Regs.CMPA.half.CMPA = V0;
EPwm1Regs.AQCTLA.bit.ZRO = AQ_SET;//将 PWM1A 设置为零
EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR;//针对事件 A 清除 PWM1A、向上计数
EPwm1Regs.AQCTLB.bit.ZRO = AQ_Clear;//将 PWM1B 设置为零
EPwm1Regs.AQCTLB.bit.CAU = AQ_SET;//在事件 B 上清除 PWM1B、向上计数
GpioDataRegs.GPACLEAR.bit.GPIO8 = 1;
__ asm (" NOP");
}
}
void InitEPwm1Example()
{
//设置 TBCLK
EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP;//递增计数
EPwm1Regs.TBPRD = EPWM1_TIMER_TBPRD;//设置计时器周期
EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE;//禁用相位加载
EPwm1Regs.TBPHS.half.TBPHS = 0x0000;//相位为0
EPwm1Regs.TBCTR = 0x0000;//清除计数器
EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;//时钟比与 SYSCLKOUT 的比率
EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV1;
//在零时设置影子寄存器加载
EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_shadow;
EPwm1Regs.CMPCTL.bit.SHDWBMODE = CC_影子;
EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;
EPwm1Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;
//设置比较值
EPwm1Regs.CMPA.half.CMPA = EPWM1_MAX_CMPA;//设置比较 A 值
EPwm1Regs.CMPB = EPWM1_MAX_CMPB;//设置比较 B 值
//设置操作
EPwm1Regs.AQCTLA.bit.ZRO = AQ_SET;//将 PWM1A 设置为零
EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR;//针对事件 A 清除 PWM1A、向上计数
EPwm1Regs.AQCTLB.bit.ZRO = AQ_Clear;//将 PWM1B 设置为零
EPwm1Regs.AQCTLB.bit.CAU = AQ_SET;//在事件 B 上清除 PWM1B、向上计数
EPwm1Regs.ETSEL.bit.SOCAEN = 1;//在组上启用 SOC
EPwm1Regs.ETSEL.bit.SOCASEL = 6;//在向上计数时从 CMPB 选择 SOC
EPwm1Regs.ETPS.bit.SOCAPRD = 1;//在发生第1个事件时生成脉冲
EPwm1Regs.DBCTL.bit.out_mode = DB_FULL_ENABLE;
EPwm1Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC;
EPwm1Regs.DBRED = 1;
EPwm1Regs.DBFED = 1;
}
空 InitEPwmTimer()
{
EALLOW;
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0;//停止所有 TB 时钟
EDIS;
//设置同步
EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_IN;//直通
//通过
//允许每个计时器同步
EPwm1Regs.TBCTL.bit.PHSEN = TB_ENABLE;
EPwm1Regs.TBPRD = EPWM1_TIMER_TBPRD;
EPwm1Regs.ETSEL.bit.INTSEL = ET_CTRU_CMPB;//在发生零事件时选择 INT
EPwm1Regs.ETSEL.bit.inten = PWM1_INT_ENABLE;//启用 INT
EPwm1Regs.ETPS.bit.INTPRD = ET_1ST;//在发生第1个事件时生成 INT
EALLOW;
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1;//开始同步所有计时器
EDIS;
}
__interrupt void epwm1_timer_ISR (void)
{
V0 = AdcResult.ADCRESULT0;
GpioDataRegs.GPASET.bit.GPIO8 = 1;
//清除此计时器的 INT 标志
EPwm1Regs.ETCLR.bit.INT = 1;
//确认该中断以接收来自组3的更多中断
PieCtrlRegs.PIEACK.all = PIEACK_Group3;
}
空 Debun (无符号短整型){
Volatile unsigned short InnerCount;
while (计数){
计数--;
InnerCount = 10000;
while (InnerCount--);
}
}
