durongze 发表于 2024-5-5 18:15:20

【官网例子分析系列】例子11--NTC

重点在这里:


ADCTIM:ADC 时序控制寄存器
    CSSETUP:ADC 通道选择时间控制 Tsetup
    CSHOLD:ADC 通道选择保持时间控制 Thold
    SMPDUTY:ADC 模拟信号采样时间控制 Tduty(注意:SMPDUTY 一定不能设置小于01010B)

ADCCFG:ADC 配置寄存器
    RESFMT:ADC 转换结果格式控制位。
      0:转换结果左对齐。ADC_RES 保存结果的高 8 位,ADC_RESL 保存结果的低 4 位。
      1:转换结果右对齐。ADC_RES 保存结果的高 4 位,ADC_RESL 保存结果的低 8 位。
    SPEED:设置 ADC 时钟{FADC=SYSclk/2/(SPEED+1)}

ADC_CONTR:ADC 控制寄存器
    ADC_POWER:ADC 电源控制位
    ADC_START:ADC 转换启动控制位
    ADC_FLAG:ADC 转换结束标志位
    ADC_EPWMT: 使能PWM 实时触发ADC 功能
    ADC_CHS: ADC 模拟通道选择位. 具体见666页

ADC_RES:保存转换结果
ADC_RESL:保存转换结果

------------------------------------------------------
原理图:



-------------------------------------------------------
例子分析:
1.获取ADC值

u16 Get_ADC12bitResult(u8 channel)//channel = 0~15
{
    ADC_RES = 0;
    ADC_RESL = 0;

        ADC_CONTR = (ADC_CONTR & 0xf0) | channel; //设置ADC转换通道
        ADC_START = 1;//启动ADC转换
    _nop_();
    _nop_();
    _nop_();
    _nop_();

    while(ADC_FLAG == 0);   //wait for ADC finish
    ADC_FLAG = 0;   //清除ADC结束标志
    return(((u16)ADC_RES << 8) | ADC_RESL);
}

2.计算温度

/********************计算温度 ***********************************************/
// 计算结果: 0对应-40.0度, 400对应0度, 625对应25.0度, 最大1600对应120.0度.
// 为了通用, ADC输入为12bit的ADC值.
// 电路和软件算法设计: Coody
/**********************************************/

#define   D_SCALE   10      //结果放大倍数, 放大10倍就是保留一位小数
u16 get_temperature(u16 adc)
{
    u16 code *p;
    u16 i;
    u8j,k,min,max;
   
    adc = 4096 - adc;   //Rt接地
    p = temp_table;
    if(adc < p)      return (0xfffe);
    if(adc > p)    return (0xffff);
   
    min = 0;      //-40度
    max = 160;      //120度

    for(j=0; j<5; j++)//对分查表
    {
      k = min / 2 + max / 2;
      if(adc <= p) max = k;
      else            min = k;
    }
         if(adc == p)i = min * D_SCALE;
    else if(adc == p)i = max * D_SCALE;
    else    // min < temp < max
    {
      while(min <= max)
      {
            min++;
            if(adc == p)   {i = min * D_SCALE; break;}
            else if(adc < p)
            {
                min--;
                i = p; //min
                j = (adc - i) * D_SCALE / (p - i);
                i = min;
                i *= D_SCALE;
                i += j;
                break;
            }
      }
    }
    return i;
}

xie2101 发表于 2024-5-23 00:45:44

其实这个例子非常简单,总结起来就是先 设置转换通道,再启动,然后一直查询,查询到后保存结果。

zhange 发表于 2024-5-23 09:19:35

adc没仔细研究   等学完全部课程再挨个测试
页: [1]
查看完整版本: 【官网例子分析系列】例子11--NTC