查看: 3335|回复: 9

[已解决] Kinetis KL36Z系列 ADC差分采样

[复制链接]
  • TA的每日心情
    开心
    2019-2-18 09:04
  • 签到天数: 23 天

    [LV.4]偶尔看看III

    15

    主题

    71

    帖子

    2

    中级会员

    Rank: 3Rank: 3

    积分
    219
    最后登录
    2019-3-5
    发表于 2018-9-21 14:58:40 | 显示全部楼层 |阅读模式
    差分输入两个引脚电压分别为DP0=1.07V,DM0=300MV,基准使用的是VREF=3.0V,16位模式,ADC采集到的电压为385MV,按理说ADC采样值不应该1.07V-300MV吗,为什么是385MV?我将ADC改为单端模式,分别测到DP0的确为1.07V,DM0为300MV。以下是我的ADC配置代码,差分和单端模式我只修改了channelNumber及enableDifferentialConversion 这两个参数,其余均未动 :
    const adc16_config_t ADC16_0_config = {
      .referenceVoltageSource = kADC16_ReferenceVoltageSourceVref,
      .clockSource = kADC16_ClockSourceAsynchronousClock,
      .enableAsynchronousClock = true,
      .clockDivider = kADC16_ClockDivider8,
      .resolution = kADC16_Resolution16Bit,
      .longSampleMode = kADC16_LongSampleDisabled,
      .enableHighSpeed = false,
      .enableLowPower = false,
      .enableContinuousConversion = false
    };
    const adc16_hardware_average_mode_t ADC16_0_hardwareAverageMode = kADC16_HardwareAverageCount8;

    void ADC16_0_init(void) {
      /* Interrupt vector ADC0_IRQn priority settings in the NVIC */
    //  NVIC_SetPriority(ADC0_IRQn, ADC16_0_IRQ_PRIORITY);
      /* Initialize ADC16 converter */
      ADC16_Init(ADC16_0_PERIPHERAL, &ADC16_0_config);                                //初始化ADC
      /* Make sure, that software trigger is used */
      ADC16_EnableHardwareTrigger(ADC16_0_PERIPHERAL, false);                //硬件触发关闭
      /* Configure hardware average mode */
      ADC16_SetHardwareAverage(ADC16_0_PERIPHERAL, ADC16_0_hardwareAverageMode);        //硬件平均
      /* Configure channel multiplexing mode */
    //ADC16_SetChannelMuxMode(ADC16_0_PERIPHERAL, ADC16_0_muxMode);
      /* Perform auto calibration */
      ADC16_DoAutoCalibration(ADC16_0_PERIPHERAL);
    }ADC配置代码。

    void ADC_Differential_DC_Channel_Config(void)
    {
            adc16ChannelConfigStruct[0].channelNumber = 0;
            adc16ChannelConfigStruct[0].enableDifferentialConversion =true;
            adc16ChannelConfigStruct[0].enableInterruptOnConversionCompleted = false;
    }ADC通道设置

    void DifferentialSample_DC(void)
    {
            uint32_t ADC_Value = 0;
            ADC_Differential_DC_Channel_Config();
            ADC16_SetChannelConfig(ADC0, 0, &adc16ChannelConfigStruct[0]);
            while (0U == (kADC16_ChannelConversionDoneFlag & ADC16_GetChannelStatusFlags(ADC0, 0)))
            {
            }
            ADC_Value = ADC16_GetChannelConversionValue(ADC0, 0);
            ADC_Value = ADC_Value*3000/4095;
            PRINTF("ADC Value: %d\r\n",ADC_Value );

    }ADC转换采集


    最佳答案

    神的罪名 发表于 2018-9-25 14:42 这是什么原因导致的? 首先,你是用16位模式,后面计算的时候: ADC_Value = ADC_Value*3000/4095; 又是采样12位模式计算,在16模式里,如果是差分模式,第15位是符号位,后面的15 ...
    每天都要开心
    回复

    使用道具 举报

    该用户从未签到

    656

    主题

    6312

    帖子

    0

    超级版主

    Rank: 8Rank: 8

    积分
    20140
    最后登录
    2024-5-5
    发表于 2018-9-21 16:16:58 | 显示全部楼层
    确认ADC引脚配置是否正确
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2019-2-18 09:04
  • 签到天数: 23 天

    [LV.4]偶尔看看III

    15

    主题

    71

    帖子

    2

    中级会员

    Rank: 3Rank: 3

    积分
    219
    最后登录
    2019-3-5
     楼主| 发表于 2018-9-21 17:12:57 | 显示全部楼层
        /* PORTE20 (pin 18) is configured as ADC0_DP0 */                //DP0
        PORT_SetPinMux(PORTE, 20U, kPORT_PinDisabledOrAnalog);

        /* PORTE21 (pin 19) is configured as ADC0_DM0 */                //DM0
        PORT_SetPinMux(PORTE, 21U, kPORT_PinDisabledOrAnalog);
    就这两个管脚哇,关键设成单端模式,采到的是正确的。差分的为何就不对了?
    每天都要开心
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    656

    主题

    6312

    帖子

    0

    超级版主

    Rank: 8Rank: 8

    积分
    20140
    最后登录
    2024-5-5
    发表于 2018-9-25 09:41:31 | 显示全部楼层
    神的罪名 发表于 2018-9-21 17:12
    /* PORTE20 (pin 18) is configured as ADC0_DP0 */                //DP0
        PORT_SetPinMux(PORTE, 20U, kPORT_Pin ...

    我还是怀疑你的代码没有配置完成,建议手动修改查分引脚的输入电压,看看采样结果会呈现何种变化,是否有什么规律可循
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2019-2-18 09:04
  • 签到天数: 23 天

    [LV.4]偶尔看看III

    15

    主题

    71

    帖子

    2

    中级会员

    Rank: 3Rank: 3

    积分
    219
    最后登录
    2019-3-5
     楼主| 发表于 2018-9-25 10:45:40 | 显示全部楼层
    小恩GG 发表于 2018-9-25 09:41
    我还是怀疑你的代码没有配置完成,建议手动修改查分引脚的输入电压,看看采样结果会呈现何种变化,是否有 ...

    我试了下,虽然采样结果是错的,但是的确是有规律的变化,DP-DM = 采样值*2。
    每天都要开心
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2019-2-18 09:04
  • 签到天数: 23 天

    [LV.4]偶尔看看III

    15

    主题

    71

    帖子

    2

    中级会员

    Rank: 3Rank: 3

    积分
    219
    最后登录
    2019-3-5
     楼主| 发表于 2018-9-25 14:41:22 | 显示全部楼层
    神的罪名 发表于 2018-9-25 10:45
    我试了下,虽然采样结果是错的,但是的确是有规律的变化,DP-DM = 采样值*2。 ...
    这是什么原因导致的?

    每天都要开心
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2019-2-18 09:04
  • 签到天数: 23 天

    [LV.4]偶尔看看III

    15

    主题

    71

    帖子

    2

    中级会员

    Rank: 3Rank: 3

    积分
    219
    最后登录
    2019-3-5
     楼主| 发表于 2018-9-25 14:42:36 | 显示全部楼层
    神的罪名 发表于 2018-9-25 10:45
    我试了下,虽然采样结果是错的,但是的确是有规律的变化,DP-DM = 采样值*2。 ...

    这是什么原因导致的?
    每天都要开心
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    656

    主题

    6312

    帖子

    0

    超级版主

    Rank: 8Rank: 8

    积分
    20140
    最后登录
    2024-5-5
    发表于 2018-9-25 15:24:53 | 显示全部楼层
    神的罪名 发表于 2018-9-25 14:42
    这是什么原因导致的?

    首先,你是用16位模式,后面计算的时候:
    ADC_Value = ADC_Value*3000/4095;
    又是采样12位模式计算,在16模式里,如果是差分模式,第15位是符号位,后面的15位才表示数据,你对照手册看一下吧
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2019-2-18 09:04
  • 签到天数: 23 天

    [LV.4]偶尔看看III

    15

    主题

    71

    帖子

    2

    中级会员

    Rank: 3Rank: 3

    积分
    219
    最后登录
    2019-3-5
     楼主| 发表于 2018-9-25 17:15:35 | 显示全部楼层
    小恩GG 发表于 2018-9-25 15:24
    首先,你是用16位模式,后面计算的时候:
    ADC_Value = ADC_Value*3000/4095;
    又是采样12位模式计算,在16 ...

    不好意思,4095是后来调试修改的,单端和差分的采样及计算都是用的16位,65535,单端16位采样出来是正确的,最高位不是符号位。若是差分的最高位为符号位,则可以解释为何差分采样的结果只有一半大小了。
    每天都要开心
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2019-2-18 09:04
  • 签到天数: 23 天

    [LV.4]偶尔看看III

    15

    主题

    71

    帖子

    2

    中级会员

    Rank: 3Rank: 3

    积分
    219
    最后登录
    2019-3-5
     楼主| 发表于 2018-9-25 17:41:13 | 显示全部楼层
    小恩GG 发表于 2018-9-25 15:24
    首先,你是用16位模式,后面计算的时候:
    ADC_Value = ADC_Value*3000/4095;
    又是采样12位模式计算,在16 ...

    的确是符号位的问题,感谢。
    无标题.png

    评分

    参与人数 1 +1 收起 理由
    NXP管管 + 1 结帖奖励

    查看全部评分

    每天都要开心
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2024-5-6 09:19 , Processed in 0.151089 second(s), 32 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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