【“要利用AD 模块,就要给AD 的内核,带隙电路上电,要准确的采集
信号也要对AD 的参考电路进行上电”】
请问这句话是什么意思呢?具体是怎么操作实施的呢!?
1.我的程序里不加如如下程序,能采样成功,加了下面的程序,反而不成功?!不知道是为什么?
2.【总复位Reset】加进去不能采样,不加采样正常。。
//初始化AD模块配置
void initadc(void)
{//AdcRegs.ADCTRL1.bit.RESET = 1; /* 复位片内ADC外设 */
AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1;//复位采样序列
//AdcRegs.ADCTRL1.bit.SUSMOD = 0; /* 忽略仿真挂起 */
//AdcRegs.ADCREFSEL.bit.REF_SEL = 0; /* 采用内部基准电压处理 */
//AdcRegs.ADCTRL3.bit.ADCBGRFDN = 3; /* 能带隙电路和参考电路上电 */
//DELAY_US(10000);
//AdcRegs.ADCTRL3.bit.ADCPWDN = 1; /* ADC内核中模拟电路上电 */
//DELAY_US(2000);
AdcRegs.ADCTRL1.bit.CPS=0;//ADCCLK=HSPCLK/1
AdcRegs.ADCTRL1.bit.ACQ_PS = ADC_SHCLK; // Sequential mode(顺序模式): //【采样率】Sample rate= 1/[(2+ACQ_PS)*ADC clock in ns]=1/(3*40ns)=8.3MHz
//如果使用[同步采样]模式:采样率=1/[(3+ACQ_PS)*ADC clock in ns)] AdcRegs.ADCTRL3.bit.ADCCLKPS = ADC_CKPS; //预分频用,核心时钟分频,此处为25MHz
AdcRegs.ADCTRL1.bit.CONT_RUN = 1; //启动停止模式Setup continuous run AdcRegs.ADCTRL1.bit.SEQ_OVRD = 0; //不(覆盖由MAX_CONV1设置的最大通道数,在整个模块通道内循环转换 ) AdcRegs.ADCCHSELSEQ1.all = 0x0; //初始化所有的ADC通道到A0
AdcRegs.ADCTRL3.bit.SMODE_SEL=0; //顺序采样模式
AdcRegs.ADCTRL1.bit.SEQ_CASC = 1; //级联模式Cascaded mode (0 双排序模式)
AdcRegs.ADCMAXCONV.bit.MAX_CONV1 = 0x0; //转换并存储到1个结果寄存器里
AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0; //采样ADCINA0通道,采样ADCINA0(引脚)
AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1 = 1; // 使能中断Enable SEQ1 interrupt AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1;// 清除中断标志
AdcRegs.ADCTRL2.bit.INT_MOD_SEQ1 =0 ;// 在每一个SEQ1序列的结束设置INT_SEQ1中断标志位
}
Bruce_旋:
请问这个采样率怎么理解?采样率不是由触发频率确定吗、
【“要利用AD 模块,就要给AD 的内核,带隙电路上电,要准确的采集
信号也要对AD 的参考电路进行上电”】
请问这句话是什么意思呢?具体是怎么操作实施的呢!?
1.我的程序里不加如如下程序,能采样成功,加了下面的程序,反而不成功?!不知道是为什么?
2.【总复位Reset】加进去不能采样,不加采样正常。。
//初始化AD模块配置
void initadc(void)
{//AdcRegs.ADCTRL1.bit.RESET = 1; /* 复位片内ADC外设 */
AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1;//复位采样序列
//AdcRegs.ADCTRL1.bit.SUSMOD = 0; /* 忽略仿真挂起 */
//AdcRegs.ADCREFSEL.bit.REF_SEL = 0; /* 采用内部基准电压处理 */
//AdcRegs.ADCTRL3.bit.ADCBGRFDN = 3; /* 能带隙电路和参考电路上电 */
//DELAY_US(10000);
//AdcRegs.ADCTRL3.bit.ADCPWDN = 1; /* ADC内核中模拟电路上电 */
//DELAY_US(2000);
AdcRegs.ADCTRL1.bit.CPS=0;//ADCCLK=HSPCLK/1
AdcRegs.ADCTRL1.bit.ACQ_PS = ADC_SHCLK; // Sequential mode(顺序模式): //【采样率】Sample rate= 1/[(2+ACQ_PS)*ADC clock in ns]=1/(3*40ns)=8.3MHz
//如果使用[同步采样]模式:采样率=1/[(3+ACQ_PS)*ADC clock in ns)] AdcRegs.ADCTRL3.bit.ADCCLKPS = ADC_CKPS; //预分频用,核心时钟分频,此处为25MHz
AdcRegs.ADCTRL1.bit.CONT_RUN = 1; //启动停止模式Setup continuous run AdcRegs.ADCTRL1.bit.SEQ_OVRD = 0; //不(覆盖由MAX_CONV1设置的最大通道数,在整个模块通道内循环转换 ) AdcRegs.ADCCHSELSEQ1.all = 0x0; //初始化所有的ADC通道到A0
AdcRegs.ADCTRL3.bit.SMODE_SEL=0; //顺序采样模式
AdcRegs.ADCTRL1.bit.SEQ_CASC = 1; //级联模式Cascaded mode (0 双排序模式)
AdcRegs.ADCMAXCONV.bit.MAX_CONV1 = 0x0; //转换并存储到1个结果寄存器里
AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0; //采样ADCINA0通道,采样ADCINA0(引脚)
AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1 = 1; // 使能中断Enable SEQ1 interrupt AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1;// 清除中断标志
AdcRegs.ADCTRL2.bit.INT_MOD_SEQ1 =0 ;// 在每一个SEQ1序列的结束设置INT_SEQ1中断标志位
}
ming zhao1:
回复 Bruce_旋:
采样率就是采样频率,即 触发AD转换器启动的频率
【“要利用AD 模块,就要给AD 的内核,带隙电路上电,要准确的采集
信号也要对AD 的参考电路进行上电”】
请问这句话是什么意思呢?具体是怎么操作实施的呢!?
1.我的程序里不加如如下程序,能采样成功,加了下面的程序,反而不成功?!不知道是为什么?
2.【总复位Reset】加进去不能采样,不加采样正常。。
//初始化AD模块配置
void initadc(void)
{//AdcRegs.ADCTRL1.bit.RESET = 1; /* 复位片内ADC外设 */
AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1;//复位采样序列
//AdcRegs.ADCTRL1.bit.SUSMOD = 0; /* 忽略仿真挂起 */
//AdcRegs.ADCREFSEL.bit.REF_SEL = 0; /* 采用内部基准电压处理 */
//AdcRegs.ADCTRL3.bit.ADCBGRFDN = 3; /* 能带隙电路和参考电路上电 */
//DELAY_US(10000);
//AdcRegs.ADCTRL3.bit.ADCPWDN = 1; /* ADC内核中模拟电路上电 */
//DELAY_US(2000);
AdcRegs.ADCTRL1.bit.CPS=0;//ADCCLK=HSPCLK/1
AdcRegs.ADCTRL1.bit.ACQ_PS = ADC_SHCLK; // Sequential mode(顺序模式): //【采样率】Sample rate= 1/[(2+ACQ_PS)*ADC clock in ns]=1/(3*40ns)=8.3MHz
//如果使用[同步采样]模式:采样率=1/[(3+ACQ_PS)*ADC clock in ns)] AdcRegs.ADCTRL3.bit.ADCCLKPS = ADC_CKPS; //预分频用,核心时钟分频,此处为25MHz
AdcRegs.ADCTRL1.bit.CONT_RUN = 1; //启动停止模式Setup continuous run AdcRegs.ADCTRL1.bit.SEQ_OVRD = 0; //不(覆盖由MAX_CONV1设置的最大通道数,在整个模块通道内循环转换 ) AdcRegs.ADCCHSELSEQ1.all = 0x0; //初始化所有的ADC通道到A0
AdcRegs.ADCTRL3.bit.SMODE_SEL=0; //顺序采样模式
AdcRegs.ADCTRL1.bit.SEQ_CASC = 1; //级联模式Cascaded mode (0 双排序模式)
AdcRegs.ADCMAXCONV.bit.MAX_CONV1 = 0x0; //转换并存储到1个结果寄存器里
AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0; //采样ADCINA0通道,采样ADCINA0(引脚)
AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1 = 1; // 使能中断Enable SEQ1 interrupt AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1;// 清除中断标志
AdcRegs.ADCTRL2.bit.INT_MOD_SEQ1 =0 ;// 在每一个SEQ1序列的结束设置INT_SEQ1中断标志位
}
Bruce_旋:
回复 ming zhao1:
AdcRegs.ADCTRL1.bit.CONT_RUN = 1; //启动停止模式Setup continuous run 这句有问题,这是连续运行模式,启动停止模式应该为0. 我也在做ADC但是采回来的波形有明显抖动,你有这种情况吗
【“要利用AD 模块,就要给AD 的内核,带隙电路上电,要准确的采集
信号也要对AD 的参考电路进行上电”】
请问这句话是什么意思呢?具体是怎么操作实施的呢!?
1.我的程序里不加如如下程序,能采样成功,加了下面的程序,反而不成功?!不知道是为什么?
2.【总复位Reset】加进去不能采样,不加采样正常。。
//初始化AD模块配置
void initadc(void)
{//AdcRegs.ADCTRL1.bit.RESET = 1; /* 复位片内ADC外设 */
AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1;//复位采样序列
//AdcRegs.ADCTRL1.bit.SUSMOD = 0; /* 忽略仿真挂起 */
//AdcRegs.ADCREFSEL.bit.REF_SEL = 0; /* 采用内部基准电压处理 */
//AdcRegs.ADCTRL3.bit.ADCBGRFDN = 3; /* 能带隙电路和参考电路上电 */
//DELAY_US(10000);
//AdcRegs.ADCTRL3.bit.ADCPWDN = 1; /* ADC内核中模拟电路上电 */
//DELAY_US(2000);
AdcRegs.ADCTRL1.bit.CPS=0;//ADCCLK=HSPCLK/1
AdcRegs.ADCTRL1.bit.ACQ_PS = ADC_SHCLK; // Sequential mode(顺序模式): //【采样率】Sample rate= 1/[(2+ACQ_PS)*ADC clock in ns]=1/(3*40ns)=8.3MHz
//如果使用[同步采样]模式:采样率=1/[(3+ACQ_PS)*ADC clock in ns)] AdcRegs.ADCTRL3.bit.ADCCLKPS = ADC_CKPS; //预分频用,核心时钟分频,此处为25MHz
AdcRegs.ADCTRL1.bit.CONT_RUN = 1; //启动停止模式Setup continuous run AdcRegs.ADCTRL1.bit.SEQ_OVRD = 0; //不(覆盖由MAX_CONV1设置的最大通道数,在整个模块通道内循环转换 ) AdcRegs.ADCCHSELSEQ1.all = 0x0; //初始化所有的ADC通道到A0
AdcRegs.ADCTRL3.bit.SMODE_SEL=0; //顺序采样模式
AdcRegs.ADCTRL1.bit.SEQ_CASC = 1; //级联模式Cascaded mode (0 双排序模式)
AdcRegs.ADCMAXCONV.bit.MAX_CONV1 = 0x0; //转换并存储到1个结果寄存器里
AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0; //采样ADCINA0通道,采样ADCINA0(引脚)
AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1 = 1; // 使能中断Enable SEQ1 interrupt AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1;// 清除中断标志
AdcRegs.ADCTRL2.bit.INT_MOD_SEQ1 =0 ;// 在每一个SEQ1序列的结束设置INT_SEQ1中断标志位
}
Kevin Dang:
因为没有其他部分代码,所以你确认没有给ADC上电ADC也一样工作了?你可以在线调试把寄存器读回来看下。是否是RESET操作导致的你所碰到的问题呢?在这个指令的前后分别看下你的寄存器。
这个序列除了应该把RST_SEQ放到power up之后,其他看不出问题。默认reset之后其实使用的就是内部的基准源。
AdcRegs.ADCTRL1.bit.RESET = 1; /* 复位片内ADC外设 */AdcRegs.ADCTRL3.bit.ADCBGRFDN = 3; /* 能带隙电路和参考电路上电 */ //DELAY_US(10000);AdcRegs.ADCTRL3.bit.ADCPWDN = 1; /* ADC内核中模拟电路上电 */DELAY_US(2000); 需要5ms延迟
AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1;//复位采样序列
【“要利用AD 模块,就要给AD 的内核,带隙电路上电,要准确的采集
信号也要对AD 的参考电路进行上电”】
请问这句话是什么意思呢?具体是怎么操作实施的呢!?
1.我的程序里不加如如下程序,能采样成功,加了下面的程序,反而不成功?!不知道是为什么?
2.【总复位Reset】加进去不能采样,不加采样正常。。
//初始化AD模块配置
void initadc(void)
{//AdcRegs.ADCTRL1.bit.RESET = 1; /* 复位片内ADC外设 */
AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1;//复位采样序列
//AdcRegs.ADCTRL1.bit.SUSMOD = 0; /* 忽略仿真挂起 */
//AdcRegs.ADCREFSEL.bit.REF_SEL = 0; /* 采用内部基准电压处理 */
//AdcRegs.ADCTRL3.bit.ADCBGRFDN = 3; /* 能带隙电路和参考电路上电 */
//DELAY_US(10000);
//AdcRegs.ADCTRL3.bit.ADCPWDN = 1; /* ADC内核中模拟电路上电 */
//DELAY_US(2000);
AdcRegs.ADCTRL1.bit.CPS=0;//ADCCLK=HSPCLK/1
AdcRegs.ADCTRL1.bit.ACQ_PS = ADC_SHCLK; // Sequential mode(顺序模式): //【采样率】Sample rate= 1/[(2+ACQ_PS)*ADC clock in ns]=1/(3*40ns)=8.3MHz
//如果使用[同步采样]模式:采样率=1/[(3+ACQ_PS)*ADC clock in ns)] AdcRegs.ADCTRL3.bit.ADCCLKPS = ADC_CKPS; //预分频用,核心时钟分频,此处为25MHz
AdcRegs.ADCTRL1.bit.CONT_RUN = 1; //启动停止模式Setup continuous run AdcRegs.ADCTRL1.bit.SEQ_OVRD = 0; //不(覆盖由MAX_CONV1设置的最大通道数,在整个模块通道内循环转换 ) AdcRegs.ADCCHSELSEQ1.all = 0x0; //初始化所有的ADC通道到A0
AdcRegs.ADCTRL3.bit.SMODE_SEL=0; //顺序采样模式
AdcRegs.ADCTRL1.bit.SEQ_CASC = 1; //级联模式Cascaded mode (0 双排序模式)
AdcRegs.ADCMAXCONV.bit.MAX_CONV1 = 0x0; //转换并存储到1个结果寄存器里
AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0; //采样ADCINA0通道,采样ADCINA0(引脚)
AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1 = 1; // 使能中断Enable SEQ1 interrupt AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1;// 清除中断标志
AdcRegs.ADCTRL2.bit.INT_MOD_SEQ1 =0 ;// 在每一个SEQ1序列的结束设置INT_SEQ1中断标志位
}
Bruce_旋:
回复 Kevin Dang:
我也在做ADC,但是采回来的波形有明显抖动。这是什么原因呢
【“要利用AD 模块,就要给AD 的内核,带隙电路上电,要准确的采集
信号也要对AD 的参考电路进行上电”】
请问这句话是什么意思呢?具体是怎么操作实施的呢!?
1.我的程序里不加如如下程序,能采样成功,加了下面的程序,反而不成功?!不知道是为什么?
2.【总复位Reset】加进去不能采样,不加采样正常。。
//初始化AD模块配置
void initadc(void)
{//AdcRegs.ADCTRL1.bit.RESET = 1; /* 复位片内ADC外设 */
AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1;//复位采样序列
//AdcRegs.ADCTRL1.bit.SUSMOD = 0; /* 忽略仿真挂起 */
//AdcRegs.ADCREFSEL.bit.REF_SEL = 0; /* 采用内部基准电压处理 */
//AdcRegs.ADCTRL3.bit.ADCBGRFDN = 3; /* 能带隙电路和参考电路上电 */
//DELAY_US(10000);
//AdcRegs.ADCTRL3.bit.ADCPWDN = 1; /* ADC内核中模拟电路上电 */
//DELAY_US(2000);
AdcRegs.ADCTRL1.bit.CPS=0;//ADCCLK=HSPCLK/1
AdcRegs.ADCTRL1.bit.ACQ_PS = ADC_SHCLK; // Sequential mode(顺序模式): //【采样率】Sample rate= 1/[(2+ACQ_PS)*ADC clock in ns]=1/(3*40ns)=8.3MHz
//如果使用[同步采样]模式:采样率=1/[(3+ACQ_PS)*ADC clock in ns)] AdcRegs.ADCTRL3.bit.ADCCLKPS = ADC_CKPS; //预分频用,核心时钟分频,此处为25MHz
AdcRegs.ADCTRL1.bit.CONT_RUN = 1; //启动停止模式Setup continuous run AdcRegs.ADCTRL1.bit.SEQ_OVRD = 0; //不(覆盖由MAX_CONV1设置的最大通道数,在整个模块通道内循环转换 ) AdcRegs.ADCCHSELSEQ1.all = 0x0; //初始化所有的ADC通道到A0
AdcRegs.ADCTRL3.bit.SMODE_SEL=0; //顺序采样模式
AdcRegs.ADCTRL1.bit.SEQ_CASC = 1; //级联模式Cascaded mode (0 双排序模式)
AdcRegs.ADCMAXCONV.bit.MAX_CONV1 = 0x0; //转换并存储到1个结果寄存器里
AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0; //采样ADCINA0通道,采样ADCINA0(引脚)
AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1 = 1; // 使能中断Enable SEQ1 interrupt AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1;// 清除中断标志
AdcRegs.ADCTRL2.bit.INT_MOD_SEQ1 =0 ;// 在每一个SEQ1序列的结束设置INT_SEQ1中断标志位
}
Kevin Dang:
回复 Bruce_旋:
这个问题比较复杂。
这个明显抖动,要看具体是抖动了多少,然后才能计算是否属于正常范围(比如ADC本身精度)
假定你这个抖动很大,那么一般来自于系统的干扰。
你可以先简单确定属于芯片部分(含芯片的供电和内部时钟或者其他控制器)造成的干扰,还是输入部分的噪声:
把输入直接接地,然后看抖动有多大,以此来判断噪声的大的来源。
定位后一般从以下改善:1. 电源 2. 使用外部滤波器 (这个要考虑自己的应用使用合适的高通和低通滤波,去掉杂波干扰并避免ADC产生混叠噪声)一般的RC滤波器就能起到作用 3. ADC的使用,你的采样频率是否合适以及参考电压的选择 4. 采用合适的均值算法.
【“要利用AD 模块,就要给AD 的内核,带隙电路上电,要准确的采集
信号也要对AD 的参考电路进行上电”】
请问这句话是什么意思呢?具体是怎么操作实施的呢!?
1.我的程序里不加如如下程序,能采样成功,加了下面的程序,反而不成功?!不知道是为什么?
2.【总复位Reset】加进去不能采样,不加采样正常。。
//初始化AD模块配置
void initadc(void)
{//AdcRegs.ADCTRL1.bit.RESET = 1; /* 复位片内ADC外设 */
AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1;//复位采样序列
//AdcRegs.ADCTRL1.bit.SUSMOD = 0; /* 忽略仿真挂起 */
//AdcRegs.ADCREFSEL.bit.REF_SEL = 0; /* 采用内部基准电压处理 */
//AdcRegs.ADCTRL3.bit.ADCBGRFDN = 3; /* 能带隙电路和参考电路上电 */
//DELAY_US(10000);
//AdcRegs.ADCTRL3.bit.ADCPWDN = 1; /* ADC内核中模拟电路上电 */
//DELAY_US(2000);
AdcRegs.ADCTRL1.bit.CPS=0;//ADCCLK=HSPCLK/1
AdcRegs.ADCTRL1.bit.ACQ_PS = ADC_SHCLK; // Sequential mode(顺序模式): //【采样率】Sample rate= 1/[(2+ACQ_PS)*ADC clock in ns]=1/(3*40ns)=8.3MHz
//如果使用[同步采样]模式:采样率=1/[(3+ACQ_PS)*ADC clock in ns)] AdcRegs.ADCTRL3.bit.ADCCLKPS = ADC_CKPS; //预分频用,核心时钟分频,此处为25MHz
AdcRegs.ADCTRL1.bit.CONT_RUN = 1; //启动停止模式Setup continuous run AdcRegs.ADCTRL1.bit.SEQ_OVRD = 0; //不(覆盖由MAX_CONV1设置的最大通道数,在整个模块通道内循环转换 ) AdcRegs.ADCCHSELSEQ1.all = 0x0; //初始化所有的ADC通道到A0
AdcRegs.ADCTRL3.bit.SMODE_SEL=0; //顺序采样模式
AdcRegs.ADCTRL1.bit.SEQ_CASC = 1; //级联模式Cascaded mode (0 双排序模式)
AdcRegs.ADCMAXCONV.bit.MAX_CONV1 = 0x0; //转换并存储到1个结果寄存器里
AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0; //采样ADCINA0通道,采样ADCINA0(引脚)
AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1 = 1; // 使能中断Enable SEQ1 interrupt AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1;// 清除中断标志
AdcRegs.ADCTRL2.bit.INT_MOD_SEQ1 =0 ;// 在每一个SEQ1序列的结束设置INT_SEQ1中断标志位
}
Bruce_旋:
回复 Kevin Dang:
你提到采用均值算法,我也看到手册说可以采用过采样提高采样精度,但是我的输入时正弦信号,不是直流高电平,这样的话,每个通道采样点其实不一样,那均值的方法是不是就不对了呢?
【“要利用AD 模块,就要给AD 的内核,带隙电路上电,要准确的采集
信号也要对AD 的参考电路进行上电”】
请问这句话是什么意思呢?具体是怎么操作实施的呢!?
1.我的程序里不加如如下程序,能采样成功,加了下面的程序,反而不成功?!不知道是为什么?
2.【总复位Reset】加进去不能采样,不加采样正常。。
//初始化AD模块配置
void initadc(void)
{//AdcRegs.ADCTRL1.bit.RESET = 1; /* 复位片内ADC外设 */
AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1;//复位采样序列
//AdcRegs.ADCTRL1.bit.SUSMOD = 0; /* 忽略仿真挂起 */
//AdcRegs.ADCREFSEL.bit.REF_SEL = 0; /* 采用内部基准电压处理 */
//AdcRegs.ADCTRL3.bit.ADCBGRFDN = 3; /* 能带隙电路和参考电路上电 */
//DELAY_US(10000);
//AdcRegs.ADCTRL3.bit.ADCPWDN = 1; /* ADC内核中模拟电路上电 */
//DELAY_US(2000);
AdcRegs.ADCTRL1.bit.CPS=0;//ADCCLK=HSPCLK/1
AdcRegs.ADCTRL1.bit.ACQ_PS = ADC_SHCLK; // Sequential mode(顺序模式): //【采样率】Sample rate= 1/[(2+ACQ_PS)*ADC clock in ns]=1/(3*40ns)=8.3MHz
//如果使用[同步采样]模式:采样率=1/[(3+ACQ_PS)*ADC clock in ns)] AdcRegs.ADCTRL3.bit.ADCCLKPS = ADC_CKPS; //预分频用,核心时钟分频,此处为25MHz
AdcRegs.ADCTRL1.bit.CONT_RUN = 1; //启动停止模式Setup continuous run AdcRegs.ADCTRL1.bit.SEQ_OVRD = 0; //不(覆盖由MAX_CONV1设置的最大通道数,在整个模块通道内循环转换 ) AdcRegs.ADCCHSELSEQ1.all = 0x0; //初始化所有的ADC通道到A0
AdcRegs.ADCTRL3.bit.SMODE_SEL=0; //顺序采样模式
AdcRegs.ADCTRL1.bit.SEQ_CASC = 1; //级联模式Cascaded mode (0 双排序模式)
AdcRegs.ADCMAXCONV.bit.MAX_CONV1 = 0x0; //转换并存储到1个结果寄存器里
AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0; //采样ADCINA0通道,采样ADCINA0(引脚)
AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1 = 1; // 使能中断Enable SEQ1 interrupt AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1;// 清除中断标志
AdcRegs.ADCTRL2.bit.INT_MOD_SEQ1 =0 ;// 在每一个SEQ1序列的结束设置INT_SEQ1中断标志位
}
Kevin Dang:
回复 Bruce_旋:
均值算法,其实我们一般是合并2种算法一起使用。首先,均值本身相当于FIR低通滤波器。在ADC的应用中,
1,我们可以对一个通道取样多次,然后求平均作为本次采样的样点,这是中值算法,这是一个平均,这个用均值是要通过提高采样率来实现的,根据那奎斯特采样定律,ADC的采样率需要达到均值点数*2*信号频率。2. 对每个通道获取的连续数据,做moving average,就是低通滤波。这个滤波器的频点和窗口大小有关。
请在网上学习关于moving average的知识。
【“要利用AD 模块,就要给AD 的内核,带隙电路上电,要准确的采集
信号也要对AD 的参考电路进行上电”】
请问这句话是什么意思呢?具体是怎么操作实施的呢!?
1.我的程序里不加如如下程序,能采样成功,加了下面的程序,反而不成功?!不知道是为什么?
2.【总复位Reset】加进去不能采样,不加采样正常。。
//初始化AD模块配置
void initadc(void)
{//AdcRegs.ADCTRL1.bit.RESET = 1; /* 复位片内ADC外设 */
AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1;//复位采样序列
//AdcRegs.ADCTRL1.bit.SUSMOD = 0; /* 忽略仿真挂起 */
//AdcRegs.ADCREFSEL.bit.REF_SEL = 0; /* 采用内部基准电压处理 */
//AdcRegs.ADCTRL3.bit.ADCBGRFDN = 3; /* 能带隙电路和参考电路上电 */
//DELAY_US(10000);
//AdcRegs.ADCTRL3.bit.ADCPWDN = 1; /* ADC内核中模拟电路上电 */
//DELAY_US(2000);
AdcRegs.ADCTRL1.bit.CPS=0;//ADCCLK=HSPCLK/1
AdcRegs.ADCTRL1.bit.ACQ_PS = ADC_SHCLK; // Sequential mode(顺序模式): //【采样率】Sample rate= 1/[(2+ACQ_PS)*ADC clock in ns]=1/(3*40ns)=8.3MHz
//如果使用[同步采样]模式:采样率=1/[(3+ACQ_PS)*ADC clock in ns)] AdcRegs.ADCTRL3.bit.ADCCLKPS = ADC_CKPS; //预分频用,核心时钟分频,此处为25MHz
AdcRegs.ADCTRL1.bit.CONT_RUN = 1; //启动停止模式Setup continuous run AdcRegs.ADCTRL1.bit.SEQ_OVRD = 0; //不(覆盖由MAX_CONV1设置的最大通道数,在整个模块通道内循环转换 ) AdcRegs.ADCCHSELSEQ1.all = 0x0; //初始化所有的ADC通道到A0
AdcRegs.ADCTRL3.bit.SMODE_SEL=0; //顺序采样模式
AdcRegs.ADCTRL1.bit.SEQ_CASC = 1; //级联模式Cascaded mode (0 双排序模式)
AdcRegs.ADCMAXCONV.bit.MAX_CONV1 = 0x0; //转换并存储到1个结果寄存器里
AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0; //采样ADCINA0通道,采样ADCINA0(引脚)
AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1 = 1; // 使能中断Enable SEQ1 interrupt AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1;// 清除中断标志
AdcRegs.ADCTRL2.bit.INT_MOD_SEQ1 =0 ;// 在每一个SEQ1序列的结束设置INT_SEQ1中断标志位
}
Bruce_旋:
回复 Kevin Dang:
使用28335进行ADC,手册说可以采用过采样提高精度,比如ADIN0引脚采样三次,然后取平均。如果输入是稳定电平,这样当然没问题。但是如果输入时正弦,是不是就不对了呢,因为三个通道采样会有先后,虽然都是对ADIN0的信号采样,但是实际上每个通道的采样时间点是不一样的,这样取平均是不是就没有意义了。请问我这么理解对不对呢,是否可以这么做,我的目的是提高采样精度。