微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 关于STC单片机AD转换精度的问题,可以过采样达到12位精度。

关于STC单片机AD转换精度的问题,可以过采样达到12位精度。

时间:10-02 整理:3721RD 点击:

     很多人都反映STC单片机AD转换精度不高,转换数值波动大。我通过一个多月的反复试验,终于找到了提高AD转换精度的方法。
       首先是硬件问题,手册提到要在AD管脚到地之间加一个电容47P左右,用来稳定电压提高精度。我的经验是不要加这个电容,电压有一点波动有利于使用过采样方法提高转换精度。我的电路可以使用过采样实现12位转换精度。关于过采样请自己百度。
       第二、AD转换时要先切换通道,延时一下再AD转换,AD转换时临时关闭中断可以使转换更稳定。
       第三、使用过采样方法提高精度,硬件是10位,过采样可以达到12位。

附上程序
unsigned int AD_get(unsigned char channel)                //AD转换
{
EA=0; //关总中断,避免显示影响转换
ADC_CONTR=0xc8|channel;    //开启AD转换1100 1000 即POWER SPEED1 SPEED0 ADC_FLAG   ADC_START CHS2 CHS1 CHS0
_nop_(); _nop_(); _nop_(); _nop_();//要经过4个CPU时钟的延时,其值才能够保证被设置进ADC_CONTR 寄存器
while((ADC_CONTR&0x10)==0);    //等待转换完成
EA=1; //开总中断
ADC_CONTR&=0xe7;      //关闭AD转换,ADC_FLAG位由软件清0
return(ADC_RES*4+ADC_RESL);   //返回AD转换完成的10位数据(16进制)
}
//------------------------------------------------------------------------------
u16 AD_work(unsigned char channel)                                //AD过采样
{
u16 AD_val=0;     //定义处理后的数值AD_val
unsigned char i;
ADC_CONTR |=channel;    //预转换通道使AD电压稳定。 即POWER SPEED1 SPEED0 ADC_FLAG   ADC_START CHS2 CHS1 CHS0
_nop_(); _nop_(); _nop_(); _nop_();//要经过4个CPU时钟的延时,其值才能够保证被设置进ADC_CONTR 寄存器
for(i=0;i<32;i++)
{
ADC_RES=0;   //清零转换结果寄存器高8位
ADC_RESL=0; //清零转换结果寄存器低2位
AD_val+=AD_get(channel); //转换32次总和(提高精度)
}
AD_val/=8;           //数值扩大到4倍,过采样到12位。
return AD_val;
}

转换结果:ad1是温度1的AD过采样转换数值,ad2是温度2的AD过采样转换数值。每秒转换一次稳定。
转换对应的温度是28.8度。
ad1= 1487;  ad2= 1489;
ad1= 1486;  ad2= 1490;
ad1= 1487;  ad2= 1489;
ad1= 1488;  ad2= 1489;
ad1= 1487;  ad2= 1490;
ad1= 1487;  ad2= 1490;
ad1= 1488;  ad2= 1490;
ad1= 1488;  ad2= 1488;
ad1= 1487;  ad2= 1488;
ad1= 1488;  ad2= 1488;
ad1= 1488;  ad2= 1489;
ad1= 1487;  ad2= 1488;
ad1= 1487;  ad2= 1489;
ad1= 1487;  ad2= 1489;
ad1= 1487;  ad2= 1489;
ad1= 1487;  ad2= 1490;
ad1= 1487;  ad2= 1490;
ad1= 1488;  ad2= 1489;
ad1= 1488;  ad2= 1489;
ad1= 1487;  ad2= 1488;
ad1= 1488;  ad2= 1489;
ad1= 1487;  ad2= 1488;
ad1= 1487;  ad2= 1490;
ad1= 1486;  ad2= 1488;
ad1= 1487;  ad2= 1489;
ad1= 1487;  ad2= 1488;
ad1= 1487;  ad2= 1489;
ad1= 1487;  ad2= 1488;
ad1= 1487;  ad2= 1488;
ad1= 1487;  ad2= 1488;
ad1= 1487;  ad2= 1488;
ad1= 1487;  ad2= 1488;
ad1= 1488;  ad2= 1488;
ad1= 1487;  ad2= 1488;
ad1= 1487;  ad2= 1488;

电路图中P0.0,P0.1错了,应该是P1.0,P1.1

转换结果:ad1是温度1的AD过采样转换数值,wd1是温度1数值,ad2是温度2的AD过采样转换数值。wd2是温度2数值,每秒转换一次。通过串口用串口助手显示的数据.
ad1= 1451; wd1= 29.4du;  ad2= 1401;wd2= 30.7du;
ad1= 1451; wd1= 29.4du;  ad2= 1403;wd2= 30.7du;
ad1= 1451; wd1= 29.4du;  ad2= 1404;wd2= 30.6du;
ad1= 1451; wd1= 29.4du;  ad2= 1404;wd2= 30.6du;
ad1= 1453; wd1= 29.4du;  ad2= 1405;wd2= 30.6du;
ad1= 1454; wd1= 29.4du;  ad2= 1405;wd2= 30.6du;
ad1= 1452; wd1= 29.3du;  ad2= 1406;wd2= 30.6du;
ad1= 1453; wd1= 29.4du;  ad2= 1406;wd2= 30.5du;
ad1= 1455; wd1= 29.4du;  ad2= 1406;wd2= 30.5du;
ad1= 1454; wd1= 29.3du;  ad2= 1405;wd2= 30.5du;
ad1= 1455; wd1= 29.3du;  ad2= 1408;wd2= 30.6du;
ad1= 1456; wd1= 29.3du;  ad2= 1408;wd2= 30.5du;
ad1= 1456; wd1= 29.3du;  ad2= 1409;wd2= 30.5du;
ad1= 1456; wd1= 29.3du;  ad2= 1410;wd2= 30.5du;
ad1= 1457; wd1= 29.3du;  ad2= 1410;wd2= 30.4du;
ad1= 1458; wd1= 29.3du;  ad2= 1410;wd2= 30.4du;
ad1= 1457; wd1= 29.2du;  ad2= 1410;wd2= 30.4du;
ad1= 1459; wd1= 29.3du;  ad2= 1411;wd2= 30.4du;
ad1= 1459; wd1= 29.2du;  ad2= 1412;wd2= 30.4du;
ad1= 1459; wd1= 29.2du;  ad2= 1410;wd2= 30.4du;
ad1= 1459; wd1= 29.2du;  ad2= 1403;wd2= 30.4du;
ad1= 1462; wd1= 29.2du;  ad2= 1390;wd2= 30.6du;
ad1= 1460; wd1= 29.1du;  ad2= 1376;wd2= 30.9du;
ad1= 1460; wd1= 29.2du;  ad2= 1363;wd2= 31.3du;
ad1= 1460; wd1= 29.2du;  ad2= 1352;wd2= 31.7du;
ad1= 1462; wd1= 29.2du;  ad2= 1342;wd2= 31.9du;
ad1= 1462; wd1= 29.1du;  ad2= 1333;wd2= 32.2du;
ad1= 1462; wd1= 29.1du;  ad2= 1325;wd2= 32.4du;
ad1= 1462; wd1= 29.1du;  ad2= 1317;wd2= 32.7du;
ad1= 1463; wd1= 29.1du;  ad2= 1308;wd2= 32.9du;
ad1= 1463; wd1= 29.1du;  ad2= 1301;wd2= 33.1du;
ad1= 1463; wd1= 29.1du;  ad2= 1295;wd2= 33.3du;
ad1= 1464; wd1= 29.1du;  ad2= 1293;wd2= 33.5du;
ad1= 1464; wd1= 29.1du;  ad2= 1286;wd2= 33.5du;
ad1= 1463; wd1= 29.1du;  ad2= 1284;wd2= 33.7du;
ad1= 1456; wd1= 29.1du;  ad2= 1284;wd2= 33.8du;
ad1= 1441; wd1= 29.3du;  ad2= 1284;wd2= 33.8du;
ad1= 1424; wd1= 29.7du;  ad2= 1286;wd2= 33.8du;
ad1= 1408; wd1= 30.1du;  ad2= 1287;wd2= 33.7du;
ad1= 1389; wd1= 30.5du;  ad2= 1288;wd2= 33.7du;
ad1= 1375; wd1= 31.0du;  ad2= 1291;wd2= 33.7du;
ad1= 1358; wd1= 31.3du;  ad2= 1294;wd2= 33.6du;
ad1= 1344; wd1= 31.8du;  ad2= 1293;wd2= 33.5du;
ad1= 1333; wd1= 32.2du;  ad2= 1297;wd2= 33.5du;
ad1= 1323; wd1= 32.4du;  ad2= 1299;wd2= 33.4du;
ad1= 1314; wd1= 32.7du;  ad2= 1300;wd2= 33.4du;
ad1= 1308; wd1= 32.9du;  ad2= 1302;wd2= 33.3du;
ad1= 1304; wd1= 33.1du;  ad2= 1302;wd2= 33.3du;
ad1= 1304; wd1= 33.2du;  ad2= 1304;wd2= 33.3du;
ad1= 1303; wd1= 33.2du;  ad2= 1306;wd2= 33.2du;
ad1= 1305; wd1= 33.2du;  ad2= 1309;wd2= 33.2du;
ad1= 1307; wd1= 33.2du;  ad2= 1310;wd2= 33.1du;
ad1= 1308; wd1= 33.1du;  ad2= 1312;wd2= 33.0du;
ad1= 1310; wd1= 33.1du;  ad2= 1315;wd2= 33.0du;
ad1= 1312; wd1= 33.0du;  ad2= 1315;wd2= 32.9du;
ad1= 1314; wd1= 33.0du;  ad2= 1317;wd2= 32.9du;
ad1= 1316; wd1= 32.9du;  ad2= 1321;wd2= 32.9du;
ad1= 1319; wd1= 32.9du;  ad2= 1321;wd2= 32.8du;
ad1= 1320; wd1= 32.8du;  ad2= 1322;wd2= 32.8du;
ad1= 1321; wd1= 32.8du;  ad2= 1325;wd2= 32.7du;
ad1= 1324; wd1= 32.8du;  ad2= 1326;wd2= 32.7du;
ad1= 1326; wd1= 32.7du;  ad2= 1327;wd2= 32.6du;
ad1= 1327; wd1= 32.6du;  ad2= 1328;wd2= 32.6du;
ad1= 1330; wd1= 32.6du;  ad2= 1330;wd2= 32.6du;
ad1= 1332; wd1= 32.5du;  ad2= 1331;wd2= 32.5du;
ad1= 1334; wd1= 32.5du;  ad2= 1333;wd2= 32.5du;
ad1= 1335; wd1= 32.4du;  ad2= 1335;wd2= 32.4du;
ad1= 1336; wd1= 32.4du;  ad2= 1336;wd2= 32.4du;
ad1= 1339; wd1= 32.4du;  ad2= 1337;wd2= 32.4du;
ad1= 1340; wd1= 32.3du;  ad2= 1338;wd2= 32.3du;
ad1= 1340; wd1= 32.3du;  ad2= 1340;wd2= 32.3du;
ad1= 1343; wd1= 32.3du;  ad2= 1340;wd2= 32.3du;
ad1= 1345; wd1= 32.2du;  ad2= 1342;wd2= 32.3du;
ad1= 1346; wd1= 32.1du;  ad2= 1343;wd2= 32.2du;
ad1= 1348; wd1= 32.1du;  ad2= 1345;wd2= 32.2du;
ad1= 1349; wd1= 32.0du;  ad2= 1346;wd2= 32.1du;
ad1= 1350; wd1= 32.0du;  ad2= 1348;wd2= 32.1du;
ad1= 1353; wd1= 32.0du;  ad2= 1350;wd2= 32.0du;
ad1= 1354; wd1= 31.9du;  ad2= 1349;wd2= 32.0du;
ad1= 1355; wd1= 31.9du;  ad2= 1351;wd2= 32.0du;
ad1= 1356; wd1= 31.9du;  ad2= 1354;wd2= 32.0du;
ad1= 1357; wd1= 31.8du;  ad2= 1354;wd2= 31.9du;
ad1= 1359; wd1= 31.8du;  ad2= 1356;wd2= 31.9du;
ad1= 1360; wd1= 31.8du;  ad2= 1357;wd2= 31.8du;
ad1= 1363; wd1= 31.7du;  ad2= 1358;wd2= 31.8du;
ad1= 1363; wd1= 31.7du;  ad2= 1359;wd2= 31.8du;
ad1= 1364; wd1= 31.7du;  ad2= 1360;wd2= 31.8du;
ad1= 1367; wd1= 31.6du;  ad2= 1361;wd2= 31.7du;
ad1= 1368; wd1= 31.5du;  ad2= 1363;wd2= 31.7du;
ad1= 1368; wd1= 31.5du;  ad2= 1363;wd2= 31.7du;
ad1= 1370; wd1= 31.5du;  ad2= 1365;wd2= 31.7du;
ad1= 1372; wd1= 31.5du;  ad2= 1365;wd2= 31.6du;
ad1= 1372; wd1= 31.4du;  ad2= 1366;wd2= 31.6du;
ad1= 1373; wd1= 31.4du;  ad2= 1369;wd2= 31.6du;
ad1= 1375; wd1= 31.4du;  ad2= 1369;wd2= 31.5du;
ad1= 1376; wd1= 31.3du;  ad2= 1368;wd2= 31.5du;
ad1= 1377; wd1= 31.3du;  ad2= 1372;wd2= 31.5du;
ad1= 1379; wd1= 31.3du;  ad2= 1371;wd2= 31.4du;
ad1= 1380; wd1= 31.2du;  ad2= 1373;wd2= 31.4du;
ad1= 1381; wd1= 31.2du;  ad2= 1375;wd2= 31.4du;
ad1= 1382; wd1= 31.2du;  ad2= 1375;wd2= 31.3du;
ad1= 1384; wd1= 31.2du;  ad2= 1376;wd2= 31.3du;
ad1= 1385; wd1= 31.1du;  ad2= 1376;wd2= 31.3du;
ad1= 1384; wd1= 31.1du;  ad2= 1379;wd2= 31.3du;
ad1= 1387; wd1= 31.1du;  ad2= 1379;wd2= 31.2du;
ad1= 1388; wd1= 31.0du;  ad2= 1380;wd2= 31.2du;
ad1= 1388; wd1= 31.0du;  ad2= 1379;wd2= 31.2du;
ad1= 1390; wd1= 31.0du;  ad2= 1381;wd2= 31.2du;
ad1= 1392; wd1= 30.9du;  ad2= 1382;wd2= 31.2du;
ad1= 1392; wd1= 30.9du;  ad2= 1383;wd2= 31.2du;
ad1= 1393; wd1= 30.9du;  ad2= 1384;wd2= 31.1du;
ad1= 1395; wd1= 30.9du;  ad2= 1384;wd2= 31.1du;
ad1= 1395; wd1= 30.8du;  ad2= 1386;wd2= 31.1du;
ad1= 1394; wd1= 30.8du;  ad2= 1386;wd2= 31.0du;
ad1= 1397; wd1= 30.8du;  ad2= 1387;wd2= 31.0du;
ad1= 1399; wd1= 30.8du;  ad2= 1388;wd2= 31.0du;
ad1= 1398; wd1= 30.7du;  ad2= 1389;wd2= 31.0du;
ad1= 1400; wd1= 30.7du;  ad2= 1391;wd2= 31.0du;
ad1= 1402; wd1= 30.7du;  ad2= 1391;wd2= 30.9du;
ad1= 1403; wd1= 30.6du;  ad2= 1391;wd2= 30.9du;
ad1= 1402; wd1= 30.6du;  ad2= 1392;wd2= 30.9du;
ad1= 1404; wd1= 30.6du;  ad2= 1393;wd2= 30.9du;
ad1= 1406; wd1= 30.6du;  ad2= 1393;wd2= 30.9du;
ad1= 1404; wd1= 30.5du;  ad2= 1395;wd2= 30.9du;
ad1= 1407; wd1= 30.6du;  ad2= 1396;wd2= 30.8du;
ad1= 1408; wd1= 30.5du;  ad2= 1395;wd2= 30.8du;
ad1= 1408; wd1= 30.5du;  ad2= 1397;wd2= 30.8du;
ad1= 1410; wd1= 30.5du;  ad2= 1399;wd2= 30.8du;
ad1= 1411; wd1= 30.4du;  ad2= 1398;wd2= 30.7du;
ad1= 1411; wd1= 30.4du;  ad2= 1401;wd2= 30.7du;
ad1= 1411; wd1= 30.4du;  ad2= 1400;wd2= 30.7du;
ad1= 1412; wd1= 30.4du;  ad2= 1401;wd2= 30.7du;
ad1= 1414; wd1= 30.4du;  ad2= 1401;wd2= 30.7du;
ad1= 1414; wd1= 30.3du;  ad2= 1403;wd2= 30.7du;
ad1= 1414; wd1= 30.3du;  ad2= 1404;wd2= 30.6du;
ad1= 1417; wd1= 30.3du;  ad2= 1403;wd2= 30.6du;
ad1= 1416; wd1= 30.3du;  ad2= 1404;wd2= 30.6du;
ad1= 1417; wd1= 30.3du;  ad2= 1406;wd2= 30.6du;
ad1= 1419; wd1= 30.3du;  ad2= 1406;wd2= 30.5du;
ad1= 1419; wd1= 30.2du;  ad2= 1406;wd2= 30.5du;
ad1= 1420; wd1= 30.2du;  ad2= 1407;wd2= 30.5du;
ad1= 1421; wd1= 30.2du;  ad2= 1408;wd2= 30.5du;
ad1= 1422; wd1= 30.2du;  ad2= 1408;wd2= 30.5du;
ad1= 1421; wd1= 30.1du;  ad2= 1410;wd2= 30.5du;
ad1= 1423; wd1= 30.2du;  ad2= 1410;wd2= 30.4du;
ad1= 1423; wd1= 30.1du;  ad2= 1410;wd2= 30.4du;
ad1= 1424; wd1= 30.1du;  ad2= 1411;wd2= 30.4du;
ad1= 1424; wd1= 30.1du;  ad2= 1412;wd2= 30.4du;
ad1= 1425; wd1= 30.1du;  ad2= 1412;wd2= 30.4du;
ad1= 1426; wd1= 30.1du;  ad2= 1413;wd2= 30.4du;
ad1= 1426; wd1= 30.0du;  ad2= 1411;wd2= 30.4du;
ad1= 1428; wd1= 30.0du;  ad2= 1414;wd2= 30.4du;
ad1= 1429; wd1= 30.0du;  ad2= 1415;wd2= 30.3du;
ad1= 1429; wd1= 30.0du;  ad2= 1417;wd2= 30.3du;
ad1= 1429; wd1= 30.0du;  ad2= 1417;wd2= 30.3du;
ad1= 1431; wd1= 30.0du;  ad2= 1416;wd2= 30.3du;
ad1= 1431; wd1= 29.9du;  ad2= 1417;wd2= 30.3du;
ad1= 1431; wd1= 29.9du;  ad2= 1419;wd2= 30.3du;
ad1= 1433; wd1= 29.9du;  ad2= 1418;wd2= 30.2du;
ad1= 1434; wd1= 29.9du;  ad2= 1419;wd2= 30.2du;
ad1= 1433; wd1= 29.8du;  ad2= 1419;wd2= 30.2du;
ad1= 1434; wd1= 29.9du;  ad2= 1421;wd2= 30.2du;
ad1= 1435; wd1= 29.8du;  ad2= 1420;wd2= 30.2du;
ad1= 1435; wd1= 29.8du;  ad2= 1421;wd2= 30.2du;
ad1= 1436; wd1= 29.8du;  ad2= 1422;wd2= 30.2du;
ad1= 1436; wd1= 29.8du;  ad2= 1424;wd2= 30.1du;
ad1= 1438; wd1= 29.8du;  ad2= 1423;wd2= 30.1du;
ad1= 1438; wd1= 29.7du;  ad2= 1423;wd2= 30.1du;
ad1= 1439; wd1= 29.7du;  ad2= 1424;wd2= 30.1du;
ad1= 1439; wd1= 29.7du;  ad2= 1424;wd2= 30.1du;
ad1= 1440; wd1= 29.7du;  ad2= 1426;wd2= 30.1du;
ad1= 1439; wd1= 29.7du;  ad2= 1426;wd2= 30.0du;
ad1= 1440; wd1= 29.7du;  ad2= 1426;wd2= 30.0du;
ad1= 1442; wd1= 29.7du;  ad2= 1427;wd2= 30.0du;
ad1= 1442; wd1= 29.6du;  ad2= 1428;wd2= 30.0du;
ad1= 1441; wd1= 29.6du;  ad2= 1428;wd2= 30.0du;
ad1= 1444; wd1= 29.7du;  ad2= 1429;wd2= 30.0du;
ad1= 1444; wd1= 29.6du;  ad2= 1428;wd2= 30.0du;
ad1= 1443; wd1= 29.6du;  ad2= 1428;wd2= 30.0du;
ad1= 1444; wd1= 29.6du;  ad2= 1430;wd2= 30.0du;
ad1= 1446; wd1= 29.6du;  ad2= 1431;wd2= 29.9du;
ad1= 1446; wd1= 29.5du;  ad2= 1429;wd2= 29.9du;
ad1= 1446; wd1= 29.5du;  ad2= 1432;wd2= 30.0du;
ad1= 1447; wd1= 29.5du;  ad2= 1432;wd2= 29.9du;
ad1= 1448; wd1= 29.5du;  ad2= 1431;wd2= 29.9du;
ad1= 1448; wd1= 29.5du;  ad2= 1432;wd2= 29.9du;
ad1= 1448; wd1= 29.5du;  ad2= 1434;wd2= 29.9du;
ad1= 1448; wd1= 29.5du;  ad2= 1434;wd2= 29.8du;
ad1= 1450; wd1= 29.5du;  ad2= 1434;wd2= 29.8du;
ad1= 1449; wd1= 29.4du;  ad2= 1434;wd2= 29.8du;
ad1= 1450; wd1= 29.5du;  ad2= 1435;wd2= 29.8du;
ad1= 1452; wd1= 29.4du;  ad2= 1435;wd2= 29.8du;

用手触摸一下温度探头温度反应很快,轻松实现0.1°的温度测量。测温电路非常简单。

感谢分享                     

学习学习,多谢小编

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top