📄 ae_sp_2812xadc.c
字号:
//*************************************************************************************
//TMS320F2812 ADC数模转换应用程序
//文件名称:AE_SP_2812xAdc.c
//设置PLL工作在x10/2模式,SYSCLKOUT经过6分频得到25MHz的HSPCLK
//ADC内部进行2x6分频,分频后的时钟再进行(ACTRL1[7]+1)分频,从而产生ADC的内核时钟ADCCLK
//EVA为SEQ1产生ADCSOC信号,EVB为SEQ2产生ADCSOC信号,转换ADCINA0和ADCINB0两个通道
//**************************************************************************************
#include"DSP28_Device.h"
interrupt void adc_isr(void);
void InitAdc(void);
//全局变量定义:
Uint16 ConversionCount;
Uint16 Voltage1[10];
Uint16 Voltage2[10];
main()
{
//step1, 初始化系统控制寄存器、PLL、看门狗和时钟
InitSysCtrl();
//时钟初始化HSPCLK=SYSCLKOUT/6=25MHz
EALLOW; //写保护
SysCtrlRegs.HISPCP.all=0x0003; //HSPCLK=SYSCLKOUT/6
EDIS; //取消写保护
//Step2,GPIO配置
//InitGpio(); //不使用
//Step3, 初始化PIE向量表
//禁止和清除所有CPU中断:
DINT;
IER=0x0000; //中断使能寄存器清零
IFR=0x0000; //中断标志
InitPieCtrl();
InitPieVectTable();
//Step4,初始化外设模块
InitAdc(); //DSP28_Adc.c
//Step5,重新分配中断向量
EALLOW;
PieVectTable.ADCINT=&adc_isr;
EDIS;
//使能PIE中的ADCINT中断
PieCtrl.PIEIER1.bit.INTx6=1;
//使能CPU中断
IER|=M_INT1; //使能全局中断INT1
//使能全局中断和高优先级适时调适功能
EINT; //使能全局中断INTM
ERTM; //使能全局适时调适中断DBGM
ConversionCount=0;
//ConfigureADC
AdcRegs.MAX_CONV.bit.MAX_CONV=0x0000; //设置SEQ1和SEQ2转换通道数量
AdcRegs.CHSELSEQ1.bit.CONV00=0x0000; //设置ADCINA0作为SEQ1的第一个转换
AdcRegs.CHSELSEQ3.bit.CONV08=0x0008; //设置ADCINAB0作为SEQ2的第一个转换
AdcRegs.ADCTRL2.bit.EVA_SOC_SEQ1=1; //EVASOC启动SEQ1
AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1=1; //使能SEQ1中断
AdcRegs.ADCTRL2.bit.EVB_SOC_SEQ2=1; //EVBSOC启动SEQ1
AdcRegs.ADCTRL2.bit.INT_ENA_SEQ2=1; //使能SEQ2中断
//配置事件管理器EVA
EvaRegs.T1CMPR=0x0080; //设置T1比较器
EvaRegs.T1PR=0xFFFF; //设置周期寄存器
EvaRegs.GPTCONA.bit.T1TOADC=1; //使能事件管理器A的EVASOC
EvaRegs.T1CON.all=0x1062; //使能定时器1比较(递增计数模式)
EvbRegs.T3CMPR=0x0080; //设置T3比较器
EvbRegs.T3PR=0xFFFF; //设置周期寄存器
EvbRegs.GPTCONB.bit.T3TOADC=1; //使能事件管理器B的EVBSOC
EvbRegs.T3CON.all=0x1062; //使能定时器3比较(递增计数模式)
//等待ADC中断
while (AdcRegs.ADC_ST_FLAG.bit.SEQ1_BSY==0)
{
AdcRegs.ADCTRL2.bit.SOC_SEQ1=1;
}
for (;;)
{
KickDog();
}
}
interrupt void adc_isr(void)
{
Voltage1[ConversionCount]=AdcRegs.RESULT0;
Voltage2[ConversionCount]=AdcRegs.RESULT1;
if(ConversionCount==9)
{
ConversionCount=0;
}
else ConversionCount++;
//重新初始化下一个ADC排序
AdcRegs.ADCTRL2.bit.RST_SEQ1=1; //复位SEQ1
AdcRegs.ADCTRL2.bit.RST_SEQ2=1; //复位SEQ2
AdcRegs.ADC_ST_FLAG.bit.INT_SEQ1_CLR=1; //清除INT SEQ1位
AdcRegs.ADC_ST_FLAG.bit.INT_SEQ2_CLR=1; //清除INT SEQ2位
PieCtrl.PIEACK.all=PIEACK_GROUP1; //响应中断
return;
}
void InitAdc(void)
{
unsigned int i;
AdcRegs.ADCTRL1.bit.RESET=1; //复位整个ADC模块,ADC控制逻辑该位清零
NOP; //空操作
AdcRegs.ADCTRL1.bit.RESET=0; //无影响
AdcRegs.ADCTRL1.bit.SUSMOD=3; //仿真挂起时排序器和其他逻辑立即停止
AdcRegs.ADCTRL1.bit.ACQ_PS=0; //采集窗口宽度为一个ADCLK周期数
AdcRegs.ADCTRL1.bit.CPS=1; //内核时钟对外设时钟分频/2
AdcRegs.ADCTRL1.bit.CONT_RUN=1;//连续运转模式,产生EOS信号后,排序器从CONV00
//或CONV08状态开始
AdcRegs.ADCTRL1.bit.SEQ_CASC=0; //双排序模式,SEQ1和SEQ2作为两个8状态排序器工作
AdcRegs.ADCTRL3.bit.ADCBGRFDN=3; //带隙和参考电路上电
for(i=0;i<10000;i++) NOP; //等待延时
AdcRegs.ADCTRL3.bit.ADCPWDN=1; //除带隙和参考电路外的ADC其他模拟电路上电
for(i=0;i<5000;i++) NOP; //等待延时
AdcRegs.ADCTRL3.bit.ADCCLKPS=6; // ADC内核时钟分频数为6,获得采样频率为104.2KHz
AdcRegs.ADCTRL3.bit.SMODE_SEL=1; //选择同步采样模式
AdcRegs.MAX_CONV.bit.MAX_CONV=0x0000; //最大转换通道数为2
AdcRegs.CHSELSEQ1.bit.CONV00=0; //通道ADCINA0
AdcRegs.CHSELSEQ3.bit.CONV08=8; //通道ADCINB0
AdcRegs.ADC_ST_FLAG.bit.INT_SEQ1_CLR=1; //清除中断标志位
AdcRegs.ADC_ST_FLAG.bit.INT_SEQ2_CLR=1; //清除中断标志位
AdcRegs.ADCTRL2.bit.EVB_SOC_SEQ=0; //不起作用
AdcRegs.ADCTRL2.bit.RST_SEQ1=0; //排序器SEQ1不起作用
AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1=1; //使能SEQ1中断申请
AdcRegs.ADCTRL2.bit.INT_MOD_SEQ1=0; //每个SEQ1序列结束时INT SEQ1置位
AdcRegs.ADCTRL2.bit.EVA_SOC_SEQ1=1; //允许EVA的触发事件启动SEQ1
AdcRegs.ADCTRL2.bit.EXT_SOC_SEQ1=0; //SEQ1外部信号启动转换位无效
AdcRegs.ADCTRL2.bit.RST_SEQ2=0; //排序器SEQ2不起作用
AdcRegs.ADCTRL2.bit.SOC_SEQ2=1; //序列2(SEQ2)转换触发启动有效
AdcRegs.ADCTRL2.bit.INT_ENA_SEQ2=0;// 禁止INT SEQ1产生中断申请
AdcRegs.ADCTRL2.bit.INT_MOD_SEQ2=0;//每个SEQ2序列结束时INT SEQ2置位
AdcRegs.ADCTRL2.bit.EVB_SOC_SEQ2=1;// 允许事件管理器B的触发信号启动SEQ2
AdcRegs.ADCTRL2.bit.SOC_SEQ1=1; //从当前停止位启动SEQ1
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -