Thread 中讨论的其他器件: controlSUITE、 C2000WARE
我修正了 C28xx 实验6示例、以包含另一个 ADC 转换器。 以下代码适用于 ADC 文件:
空 InitAdca (空)
{
asm (" EALLOW");//启用 EALLOW 受保护寄存器访问
//--复位 ADC。 这是一种良好的编程实践。
DevCfgRegs.SOFTPRES13.bit.ADC_A = 1;// ADC 复位
DevCfgRegs.SOFTPRES13.bit.ADC_A = 0;// ADC 从复位中释放
DevCfgRegs.SOFTPRES13.bit.ADC_B = 1;// ADC 复位
DevCfgRegs.SOFTPRES13.bit.ADC_B = 0;// ADC 从复位中释放
//---配置 ADC 基址寄存器
AdcaRegs.ADCCTL1.ALL = 0x0004;//主 ADC 配置
AdcbRegs.ADCCTL1.ALL = 0x0004;//主 ADC 配置
//位15-14 00:保留
//位13 0:ADCBSY、ADC 忙、只读
//位12 0:保留
//位11-8 0:ADCBSYCHN、ADC 忙通道、只读
//位7 0:ADCPWDNZ、ADC 断电、0 =断电、1 =上电
//位6-3 0000:保留
//位2 1:INTPULSEPOS、INT 脉冲生成、0=转换开始、1=转换结束
//位1-0 00:保留
AdcaRegs.ADCCTL2.all = 0x0006;// ADC 时钟配置
AdcbRegs.ADCCTL2.all = 0x0006;// ADC 时钟配置
//位15-8 0:保留
//位7 0:SIGNALMODE,由下面的 AdcSetMode()配置以获得正确的校准
//位6 0:分辨率,由下面的 AdcSetMode()配置以获得正确的校准
//位5-4 00:保留
//位3-0 0110:预分频、ADC 时钟预分频器。 0110=CPUCLK/4
AdcaRegs.ADCBURSTCTL.ALL = 0x0000;
AdcbRegs.ADCBURSTCTL.ALL = 0x0000;
//位15 0:BURSTEN、0 =禁用突发模式、1 =启用突发模式
//位14-12000:保留
//位11-8 0000:BURSTSIZE、0=1 SOC 已转换(无关)
//位7-6 00:保留
//位5-0 000000:BURSTTRIGSEL,00=仅软件(无关)
//---调用 AdcSetMode()以配置分辨率和信号模式。
//这也会对配置的模式执行正确的 ADC 校准。
AdcSetMode (ADC_ADCA、ADC_resolution_12位、ADC_SIGNALMODE_SINGLE);
AdcSetMode (ADC_ADCB、ADC_Resolution、12位、ADC_SIGNALMODE_SINGLE);
//-- SOC0配置
AdcaRegs.ADCSOC0CTL.bit.TRIGSEL = 7;//使用 ePWM2-ADCSOCA 触发
AdcaRegs.ADCSOC0CTL.bit.CHSEL = 0;//转换通道 ADCINA0 (通道0)
AdcaRegs.ADCSOC0CTL.bit.ACQPS = 19;//采集窗口设置为(19+1)=20个周期(200MHz SYSCLK 时为100ns)
AdcaRegs.ADCINTSOCSEL.bit.SOC0 = 0;//无 ADC 中断触发 SOC0 (TRIGSEL 域决定触发)
AdcaRegs.ADCSOCPRICTL.bit.SOCPRIORITY = 0;//所有 SOC 在循环模式下处理
///--- ADC B 的 SOC0配置
AdcbRegs.ADCSOC0CTL.bit.TRIGSEL = 7;//使用 ePWM2-ADCSOCA 触发
AdcbRegs.ADCSOC0CTL.bit.CHSEL = 0;//转换通道 ADCINA0 (通道0)
AdcbRegs.ADCSOC0CTL.bit.ACQPS = 19;//采集窗口设置为(19+1)= 20个周期(200MHz SYSCLK 时为100ns)
AdcbRegs.ADCINTSOCSEL.bit.SOC0 = 0;//无 ADC 中断触发 SOC0 (TRIGSEL 域决定触发)
AdcbRegs.ADCSOCPRICTL.bit.SOCPRIORITY = 0;//所有 SOC 在循环模式下处理
//-- ADCA1中断配置
AdcaRegs.ADCINTSEL1N2.bit.INT1CONT = 1;//中断脉冲、与标志状态无关
AdcaRegs.ADCINTSEL1N2.bit.INT1E = 1;//启用 ADC 中的中断
AdcaRegs.ADCINTSEL1N2.bit.INT1SEL = 0;// EOC0触发中断
//-- ADCB1中断配置
AdcbRegs.ADCINTSEL1N2.bit.INT1CONT = 1;//中断脉冲、与标志状态无关
AdcbRegs.ADCINTSEL1N2.bit.INT1E = 1;//启用 ADC 中的中断
AdcbRegs.ADCINTSEL1N2.bit.INT1SEL = 0;// EOC0触发中断
//--启用 ADC 中断
PieCtrlRegs.PIEIER1.bit.INTx1 = 1;//在 PIE 组1中启用 ADCA1中断
IER |= 0x0001;//在 IER 中启用 INT1以启用 PIE 组
//--完成
AdcaRegs.ADCCTL1.bit.ADCPWDNZ = 1;//为 ADC 加电
DelayU (1000);//加电后等待1ms、然后再使用 ADC
asm (" EDIS");//禁用 EALLOW 受保护寄存器访问
}//结束 InitAdc()
//--文件结尾------
ISR 代码如下所示:
///----------------------------------------------------------
中断空 ADCA1_ISR (空)// PIE1.1 @ 0x000D40 ADC-A 中断#1
{
静态 uint16 * AdcBufPtr = AdcBuf;//指向缓冲区的指针
静态 uint16 iQuadratureTable = 0;//正交表索引
静态易失性 UINT16 GPIO34_COUNT = 0;//引脚切换计数器
静态易失性 UINT16 PwmModDelay = 0;//更改 PWM 的计数器
静态易失性 UINT16 PwmModDir = 1;//为 PWM 创建一个方向
静态易失性 UINT16 PwmCmpaVal = PWM_MAX_DUTY;// PWM 的起始值
PieCtrlRegs.PIEACX.ALL = PIEACK_Group1;//必须确认 PIE 组
//--管理 ADC 寄存器
AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;//清除 ADCINT1标志
//---读取 ADC 结果
*AdcBufPtR++= AdcResultRegs.ADCRESULT0;//读取结果
//--蛮力强制循环缓冲器
if (AdcBufPtr ==(AdcBuf + ADC_BUF_LEN))
{
AdcBufPtr = AdcBuf;//将指针回卷到开头
}
///----------------------------------------------------------
中断空 ADCB1_ISR (空)// PIE1.2 @ 0x000D42 ADC-B 中断#1
{
静态 uint16 * AdcBufPtr = AdcBuf;//指向缓冲区的指针
静态 uint16 iQuadratureTable = 0;//正交表索引
静态易失性 UINT16 GPIO34_COUNT = 0;//引脚切换计数器
静态易失性 UINT16 PwmModDelay = 0;//更改 PWM 的计数器
静态易失性 UINT16 PwmModDir = 1;//为 PWM 创建一个方向
静态易失性 UINT16 PwmCmpaVal = PWM_MAX_DUTY;// PWM 的起始值
PieCtrlRegs.PIEACX.ALL = PIEACK_Group1;//必须确认 PIE 组
//--管理 ADC 寄存器
AdcbRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;//清除 ADCINT1标志
//---读取 ADC 结果
*AdcBufPtR++= AdcbResultRegs.ADCRESULT0;//读取结果
//--蛮力强制循环缓冲器
if (AdcBufPtr ==(AdcBuf + ADC_BUF_LEN))
{
AdcBufPtr = AdcBuf;//将指针回卷到开头
}
}