大家好。最近刚学到DSP2812的AD部分,学着AD有些不懂得的问题,请求给与开导。
1、AD的ADCLK也就是AD的时钟吧,这个和AD的转换周期是一样的吗?AD的转换周期是指一个通道的转换还是所有通道都转换完的周期?
2、AD的采样和AD的周期。采用频率,是啥意思。
3、AD进入中断一次的时间如何计算。
4、AD采样时候,在同一通道采用好几次,度数据时候需要延迟吗?延时时间如何计算】
这个程序的采用周期如何计算的
void Init_adc()
{
int i;
//用的20M外部晶振
EALLOW;
SysCtrlRegs.HISPCP.all = 0x05; //预定标时钟
// HSPCLK = SYSCLKOUT/ADC_MODCLK=100/(2*5)=10M ADC的基准时钟
EDIS;
AdcRegs.ADCTRL1.bit.RESET=1;//使ADC模块复位
delay_ms=5;
while(delay_ms!=0);
//adcclkps 内核时钟分频器,连续采样
AdcRegs.ADCTRL3.all = 0x00E0;//0111 0000/ // Power up bandgap/reference/ADC circuit
//ADCCRTL3 有采样方式选择,是第0位。0表示顺序采样
//【1:4】ADCLKPS-内核时钟分频器 HSPCLK被2*ADCCLKPS分频,当为0时HSPCLK直接输出 8分频
//ADCLK=HSPCLK/【16*(ADCTRL1[7]+1)】=10/1
//[5]ADC电源控制。0表示除带隙和参考电路外的ADC其他模拟电路掉电
delay_ms=5;
while(delay_ms!=0);
AdcRegs.ADCTRL1.bit.CPS=0;//内核时钟预定标器,对外设高速HSPCLK分频ADCLK=HSPCLK/CPS+1=10Mhz
AdcRegs.ADCTRL1.bit.ACQ_PS = 0x03; //采集窗口大小3,用于控制采样过程中SOC脉冲宽度SOC=(ACQ_PS+1)*ADCLK
// Sequential mode: Sample rate = 1/[(2+ACQ_PS)*ADC clock in ns]
// = 1/(2+3) =HSPCLK/5 MHz//顺序采样10/5=2MHz====0.5um 采样频率
// If Simultaneous mode enabled: Sample rate = 1/[(3+ACQ_PS)*ADC clock in ns]并发采样
if(fren) AdcRegs.ADCTRL3.bit.ADCCLKPS = 500/(unsigned char)fren;
//级联方式seq1和seq2作为一个16状态序列发生器seq
AdcRegs.ADCTRL1.bit.SEQ_CASC = 1; // 1 Cascaded mode级联系列发生器工作方式
// AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x0;
AdcRegs.ADCTRL1.bit.CONT_RUN = 1; // Setup continuous run连续工作方式
AdcRegs.ADCTRL1.bit.SEQ_OVRD = 0; // Enable Sequencer override feature//不用关心
if(soft_switch[DEBUG])//如果在诊断下就4个通道都采样
{
AdcRegs.ADCCHSELSEQ1.all = 0x09b8a; // Initialize all ADC channel selects to A0
//选择八个通道 0000 1001 1011 1000 1010
// 1 3 0 2
}
else //其他时候只有两个通道 A通道信号值和B通道信号值
{
AdcRegs.ADCCHSELSEQ1.all = 0x08a8a;//第四位为1时选择B通道采样
//六个通道 //0000 1000 1010 1000 1010
// 0 2 0脚 2脚
}
AdcRegs.ADCMAXCONV.bit.MAX_CONV1 = 0x03; // convert and store in 8 results registers最大转换通道
AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1=1;//seq1中断使能
AdcRegs.ADCTRL2.bit.INT_MOD_SEQ1=0; //中断方式,每个序列转换完结束时置位中断
for (i=0; i<BUF_SIZE; i++)
{
SampleTableb0[i] = 0;
SampleTableb1[i] = 0;
SampleTableb2[i] = 0;
SampleTableb3[i] = 0;
}
msg="\r\nInit adc OK!\r\n";
buf_FIFO(&sci_send_fifo,msg,16);
}
这个程序的采用周期如何计算的 |