查看: 3549|回复: 2

FM33L025 ADC REF1.2V测试不准

[复制链接]

8

主题

15

帖子

144

积分

中级工程师

Rank: 2

积分
144
发表于 2022-1-19 09:58:03 | 显示全部楼层 |阅读模式
如题,采用FM33L025芯片,采用PC9--ADC0测量外部电压,但是测量内部1.2V电压时发现ad值不稳定,当PC9电压超过1.85V时,1.2V的电压测量值就偏差很大,偏差能达到上下一两百左右,当PC9电压低于1.85V时,1.2V的电压测量值稳定在1485,偏差就几个数。采用的FL固件库的程序移植的,希望大神解惑。系统时钟为RCHF 16MHz,测量外部电压又是比较稳定的。
  1. //adc初始化

  2. void adcInit(void)
  3. {
  4.     GPIO_InitTypeDef GPIO_InitStruct = {0};
  5.     //AD检测口
  6.     GPIO_InitStruct.Pin = ADC_DET_PIN;
  7.     GPIO_InitStruct.PxFCR = GPIO_FCR_ANA;
  8.     GPIO_InitStruct.PxPUEN = GPIO_PU_Dis;
  9.     GPIO_InitStruct.PxINEN = GPIO_IN_Dis;
  10.     GPIO_InitStruct.PxODEN = GPIO_OD_En;
  11.     GPIO_Init( ADC_DET_PORT, &GPIO_InitStruct );

  12.     // 模块时钟
  13.     RCC_OPC_CR2_ADCCKE_Setable(ENABLE);                 // ADC时钟使能
  14.     RCC_OPC_CR2_ADCPRSC_Set(RCC_OPC_CR2_ADCPRSC_DIV16); // ADC工作时钟
  15.     RCC_OPC_CR2_ADCCKS_Set(RCC_OPC_CR2_ADCCKS_RCHF);   // ADC时钟 RCHF

  16.     // 电源控制
  17.     if(DISABLE == PMU_VREF_CR_EN_Getable())   //判断ref122是否使能,如果禁止需清IF,保证下次使能查到的IF正确
  18.         PMU_VREF_SR_IF_Clr();
  19.     PMU_VREF_CR_EN_Setable(ENABLE);     // EN VREF1.22
  20.     while(!PMU_VREF_SR_IF_Chk());
  21.     // 复位ADC模块
  22.     RCC_PRST_EN_Write(RSTKEY0);
  23.     RCC_APBRST_CR2_ADCRST_Setable(ENABLE);  // 数字部分复位
  24.     RCC_APBRST_CR2_ADCRST_Setable(DISABLE);
  25.     RCC_APBRST_CR2_ADCCRST_Setable(ENABLE); // 模拟部分复位
  26.     RCC_APBRST_CR2_ADCCRST_Setable(DISABLE);
  27.     RCC_PRST_EN_Write(RSTKEY1);

  28.     //上电校准
  29.     ADC_CR_ADEN_Setable(ENABLE);    // 使能ADC
  30.     ADC_CAL_CALEN_Setable(ENABLE);  // Calibration使能,软件写1启动校准周期,硬件开始校准后自动清零。软件通过EOCAL寄存器查询校准周期结束。
  31.     while(0 == ADC_ISR_EOCAL_Chk());
  32.     ADC_ISR_EOCAL_Clr();            // 清校准结束
  33.     ADC_CR_ADEN_Setable(DISABLE);   // 关闭ADC

  34.     // ADC配置
  35.     ADC_CAL_CONV_CAL_Set(ADC_CAL_CONV_CAL_USE_CAL); //ADC转换使用校准寄存器里的数据

  36.     ADC_SMTR_SMTS1_Set(ADC_SMTR_SMTS1_10_5_TMCLK);  //设置快速采样时间

  37.     ADC_SMTR_SMTS2_Set(ADC_SMTR_SMTS2_10_5_TMCLK);  //设置快速采样时间

  38.     // ADC配置寄存器
  39.     ADC_CFGR_CKS_Set(ADC_CFGR_CKS_ADCCLK);  // ADCCLK
  40.     ADC_CFGR_CONT_Setable(DISABLE);          // ENABLE:连续转换, DISABLE: 单次转换
  41.     ADC_CFGR_SEMI_Set(ADC_CFGR_SEMI_AUTO);   //半自动,仅单次转换有效
  42.     ADC_CFGR_OVRM_Set(ADC_CFGR_OVRM_COVER); // 当overrun发生时,覆盖上次数据

  43.     ADC_CFGR_OVSS_Set(ADC_CFGR_OVSS_R_SHIFT_4);
  44.     ADC_CFGR_OVSR_Set(ADC_CFGR_OVSR_16x);
  45.     ADC_CFGR_OVSEN_Setable(ENABLE);
  46.     ADC_CFGR_WAIT_Setable(ENABLE);
  47.     //AD检测口设置为ADC输入通道
  48.     GPIOx_ANEN_Setable(ADC_DET_PORT, ADC_DET_PIN, ENABLE);
  49. }

  50. //测试发现引脚电压超过1.85V,测到的1.22V的电压值就变化比较大,正常在1485
  51. uint16_t GetVref1p22Sample(void)
  52. {
  53.     uint8_t i = 0;
  54.     uint32_t adc_val = 0;
  55.     uint32_t result = 0;
  56.     //此处分频不能太小,否则最终测量电压会偏高
  57.     //实测,16MHz RCHF,分频8,会偏高,改到16分频,则数据正常
  58.     RCC_OPC_CR2_ADCPRSC_Set(RCC_OPC_CR2_ADCPRSC_DIV16);// ADC时钟16分频,VREF的驱动能力较弱,采样时间不能小于10.5*(1/2M)

  59.     PMU_BUF_CR_VREFBUFFER_EN_Setable(ENABLE);   // 电压通道使能
  60.     RCC_OPC_CR2_ADCCKE_Setable(ENABLE);         // ADC时钟使能
  61.     ADC_CHER_REFCH_Setable(ENABLE);                    // VREF测量通道使能
  62.     PMU_VREF_CR_EN_Setable(ENABLE);     // EN VREF1.22
  63.    
  64.     ADC_ISR_EOC_Clr();
  65.     ADC_CR_ADEN_Setable(ENABLE);   // 启动ADC
  66.     delay_ms(5);                          // 软件延时至少5个ADC工作时钟   
  67.     for (i = 0; i < 4; i++)
  68.     {
  69.         ADC_CR_START_Setable(ENABLE);  // 开始转换
  70.         while (ADC_ISR_EOC_Chk() == RESET);
  71.         ADC_ISR_EOC_Clr();
  72.         adc_val = ADC_DR_Read();
  73.         result += adc_val;
  74.     }
  75.     result = result/4;

  76.     ADC_CR_ADEN_Setable(DISABLE);               // 关闭ADC
  77.     while(ADC_ISR_BUSY_Chk());
  78.     RCC_OPC_CR2_ADCCKE_Setable(DISABLE);        // ADC时钟关闭

  79. //    PMU_BUF_CR_VREFBUFFER_EN_Setable(DISABLE);  // VREF BUFFER输出关闭
  80.     ADC_CHER_REFCH_Setable(DISABLE);                // VREF测量通道关闭

  81.     // 返回转换结果
  82.     return (uint16_t)result;
  83. }
复制代码


回复

使用道具 举报

1

主题

44

帖子

2258

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2258
发表于 2022-1-20 10:38:29 | 显示全部楼层
没太看懂,意思是说REF1.2在测量PC9高于1.85V的时候,采样值偏差很大,但是算出的外部电压又是稳定的??那这时候的VDD电压稳定吗
回复

使用道具 举报

8

主题

15

帖子

144

积分

中级工程师

Rank: 2

积分
144
 楼主| 发表于 2022-1-21 15:23:01 | 显示全部楼层
我是一只鱼21 发表于 2022-1-20 10:38
没太看懂,意思是说REF1.2在测量PC9高于1.85V的时候,采样值偏差很大,但是算出的外部电压又是稳定的??那 ...

vdd电压稳定的,找到问题了。芯片用的设配器供电,pc9的电压是另一个可调电源,可调电源地接到板子上,电源正接到pc9引脚。是2个不同电源导致的
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表