【官网例子分析系列】例子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;
}
其实这个例子非常简单,总结起来就是先 设置转换通道,再启动,然后一直查询,查询到后保存结果。 adc没仔细研究 等学完全部课程再挨个测试
页:
[1]