请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号:MSP430FR2433 是否有人在更高的采样频率下使用了10位 ADC? 我想知道在较高的频率下、响应是否是线性的。
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
是否有人在更高的采样频率下使用了10位 ADC? 我想知道在较高的频率下、响应是否是线性的。
您好、Kunal、
我做了一些测试,并将一些来自我身边的数据作为您的参考:
测试环境:
VREF:3.3V
ADC:10位
速度:80kps
| 电压 | 0.6. | 0.7. | 0.8. | 0.9. | 1 | 1.1. | 1.2. | 1.3. | 1.4. | 1.5 | 1.6. | 1.7. | 1.8 | 1.9. | 2. | 2.1 | 2.2. | 2.3. | 2.4 | 2.5. | 2.6. | 2.7. | 2.8. | 2.9. | 3. |
| ADC 值 | 186. | 215. | 249. | 277. | 309. | 344. | 373. | 405. | 435 | 465 | 500 | 529 | 561. | 591. | 619 | 651. | 684 | 716) | 745-45 | 779 | 809) | 840) | 869) | 901. | 935. |
测试日期显示 该值的线性度很好、我没有发现任何问题。
此致
Johnson
有我的测试代码作为您的参考:
#include
void Software_Trim (); //获取最佳 DCOFTRIM 值
#define MCLK_FREQ_MHz 的软件调整8. // MCLK = 8MHz
unsigned int ADC_value = 0;
int main (void)
{
WDTCTL = WDTPW | WDTHOLD; //停止 WDT
//配置 GPIO
P1DIR |= BIT0; //将 P1.0设置为输出方向
P1OUT &=~BIT0; //清除 P1.0
//配置 ADC A1引脚
SYSCFG2 |= ADCPCTL1;
//配置 XT1振荡器
P2SEL0 |= BIT0 | BIT1; // P2.0~P2.1:晶振引脚
//禁用 GPIO 上电默认高阻抗模式以激活
//先前配置的端口设置
PM5CTL0 &=~LOCKLPM5;
_bis_SR_register (SCG0); //禁用 FLL
CSCTL3 |= SELREF_REFOCLK; //将 REFO 设置为 FLL 基准源
CSCTL1 = DCOFTRIMEN | DCOFTRIM0 | DCOFTRIM1 | DCORSEL_3;// DCOFTRIM = 3、DCO 范围= 8MHz
CSCTL2 = FLLD_0 + 243; // DCODIV = 8MHz
_DELAY_CYCLES (3);
_BIC_SR_register (SCG0); //启用 FLL
Software_Trim (); //软件调整以获得最佳 DCOFTRIM 值
CSCTL4 = SELMS_DCOCLKDIV | SELA_REFOCLK;//将默认 REFO (~32768Hz)设置为 ACLK 源、ACLK = 32768Hz
//默认 DCODIV 为 MCLK 和 SMCLK 源
//配置 ADC
ADCCTL0 |= ADCON | ADCMSC; // ADCON
ADCCTL1 |= ADCSHS_2 | ADCCONSEQ_2; //重复单通道;TA1.1 TRIG 采样开始
ADCCTL2 |= ADCRES; // 10位转换结果
ADCMCTL0 |= ADCINCH_1 | ADCSREF_0; // A1 ADC 输入选择;Vref=1.5V
ADCIE |= ADCIE0; //启用 ADC 转换完成中断
//配置引用
PMMCTL0_H = PMMPW_H; //解锁 PMM 寄存器
PMMCTL2 |= INTREFEN; //启用内部基准
_DELAY_CYCLES (400); //基准趋稳延迟
ADCCTL0 |= ADCENC; // ADC 使能
// ADC 转换触发信号- TimerA1.1 (80KHz 导通周期)
TA1CCR0 = 100-1; // PWM 周期
TA1CCR1 = 50-1; // TA1.1 ADC 触发
TA1CCTL1 = OUTMOD_4; // TA1CCR0切换
TA1CTL = tassel__SMCLK | MC_1 | TACLR; // ACLK、向上计数模式
_bis_SR_register (LPM0_bits | GIE); //输入带中断的 LPM3
}
// ADC 中断服务例程
#if defined (__TI_Compiler_version__)|| defined (__IAR_systems_ICC__)
#pragma vector=ADC_vector
__interrupt void ADC_ISR (void)
#Elif defined (__GCOMPILE__)
void __attribute__(((nC_vector)#interrupt
!void (nc)#inc Compiler (void)错误!
#endif
{
switch (__evo_in_range (ADCIV、ADCIV_ADCIFG))
{
案例 ADCIV_NONE:
中断;
ADCIV_ADCOVIFG 案例:
中断;
案例 ADCIV_ADCTOVIFG:
中断;
ADCIV_ADCHIIFG 案例:
中断;
ADCIV_ADCLOIFG 案例:
中断;
ADCIV_ADCINIFG 案例:
中断;
ADCIV_ADCIFG 案例:
ADC_Value = ADCMEM0;
// 如果(ADCMEM0 < 0x155) // ADCMEM = A0 < 0.5V?
// P1OUT &=~BIT0; //清除 P1.0 LED 关闭
// else
// P1OUT |= BIT0; //将 P1.0 LED 设置为打开
ADCIFG = 0;
中断; //将 CPUOFF 位从0 (SR)清零
默认值:
中断;
}
}
void Software_Trim ()
{
unsigned int oldDcotTap = 0xFFFF;
unsigned int newDcoTap = 0xFFFF;
unsigned int newDcoDelta = 0xFFFF;
unsigned int bestDcoDelta = 0xFFFF;
unsigned int csCtl0Copy = 0;
unsigned int csCtl1Copy = 0;
无符号 int csCtl0Read = 0;
无符号 int csCtl1Read = 0;
unsigned int dcoFreqTrim = 3;
unsigned char endLoop = 0;
操作
{
CSCTL0 = 0x100; // DCO 抽头= 256
操作
{
CSCTL7 &=~DCOFFG; //清除 DCO 故障标志
} while (CSCTL7 & DCOFFG); //测试 DCO 故障标志
__DELAY_CYCLLES ((unsigned int) 3000 * MCLK_FREQ_MHz);//等待 FLL 锁定状态(FLLUNLOCK)保持稳定
//建议等待24个经过分频的 FLL 参考时钟周期
while (((CSCTL7 &(FLLUNLOCK0 | FLLUNLOCK1))和&((CSCTL7 & DCOFFG)= 0));
CSCCtl0Read = CSCTL0; //读取 CSCTL0
CSCCtl1Read = CSCTL1; //读取 CSCTL1
oldDcoTap = newDcoTap; //记录上次的 DCOTAP 值
NewDcoTap = csCtl0Read & 0x01ff; //获取此次的 DCOTAP 值
dcoFreqTrim =(csCtl1Read & 0x0070)>>4;//获取 DCOFTRIM 值
if (newDcoTap < 256) // DCOTAP < 256
{
newDcoDelta = 256 - newDcoTap; // DCPTAP 和256之间的增量值
if ((oldDcotap!= 0xFFFF)&&(oldDcotap >= 256)// DCOTAP 交叉256
endLoop = 1; //停止 while 循环
其他
{
dcoFreqTrim --;
CSCTL1 =(csCtl1Read &(~(DCOFTRIM0+DCOFTRIM1+DCOFTRIM2)))|(dcoFreqTrim <4);
}
}
其他 // DCOTAP >= 256
{
newDcoDelta = newDcoTap - 256; // DCPTAP 和256之间的增量值
if (oldDcoTap < 256) // DCOTAP 交叉256
endLoop = 1; //停止 while 循环
其他
{
dcoFreqTrim++;
CSCTL1 =(csCtl1Read &(~(DCOFTRIM0+DCOFTRIM1+DCOFTRIM2)))|(dcoFreqTrim <4);
}
}
if (newDcoDelta < bestDcoDelta) //记录最接近256的 DCOTAP
{
csCtl0Copy = csCtl0Read;
csCtl1Copy = csCtl1Read;
bestDcoDelta = newDcoDelta;
}
}while (endLoop =0); //轮询直至 endLoop = 1
CSCTL0 = csCtl0Copy; //重新加载锁定的 DCOTAP
CSCTL1 = csCtl1Copy; //重新加载锁定的 DCOFTRIM
while (CSCTL7 &(FLLUNLOCK0 | FLLUNLOCK1));//轮询直到 FLL 被锁定
}
此致
Johnson