沁恒CH583的AD测试
<p>通过usb下载程序后,断电,把串口连接到开发板,电源指示灯微亮,可是程序并不运行。</p><p>打开串口助手,没有任何信息,配置好串口后,接通usb电源后,电源等变得更亮了。</p>
<p>串口助手也显示</p>
<p>Start @ChipID=82</p>
<p>1.Temperature sampling...<br />
2805 <br />
2806 <br />
2807 <br />
2805 <br />
2804 <br />
2806 <br />
2804 <br />
2805 <br />
2807 <br />
2806 <br />
2805 <br />
2807 <br />
2805 <br />
2805 <br />
2806 <br />
2805 <br />
2806 <br />
2807 <br />
2804 <br />
2806 </p>
<p>连续20次的采样,最小的2804,最大的2807</p>
<p>12位的AD,最低两位还是丢弃,当10位的AD来用吧,有的场合也够用了。</p>
<p>这个例子测试的是内部温度的ADC,连续20次读取温度的AD值。</p>
<p> </p>
<p>发完上个帖子,就想再看一下AD吧,就按了下reset。</p>
<p>有一次的连续20次AD采样,会有奇迹出现吗?</p>
<p>2807 <br />
2804 <br />
2806 <br />
Start @ChipID=82</p>
<p>1.Temperature sampling...<br />
2808 <br />
2806 <br />
2809 <br />
2807 <br />
2805 <br />
2811 <br />
2806 <br />
2805 <br />
2809 <br />
2809 <br />
2805 <br />
2809 <br />
2808 <br />
2808 <br />
2811 <br />
2808 <br />
2806 <br />
2809 <br />
2808 <br />
2807 </p>
<p> </p>
<p>估计是程序运行,芯片温度升高,AD采样值从2805到2811,整体增加了,这样的话,12位的AD只能用9位了吧</p>
<p>再读一次</p>
<p>Start @ChipID=82</p>
<p>1.Temperature sampling...<br />
2810 <br />
2807 <br />
2811 <br />
2809 <br />
2807 <br />
2811 <br />
2807 <br />
2809 <br />
2809 <br />
2810 <br />
2809 <br />
2809 <br />
2811 <br />
2809 <br />
2811 <br />
2809 <br />
2809 <br />
2809 <br />
2808 <br />
2810 </p>
<p>内部温度AD值从2807到2811。</p>
<p>内部温度采样就这样了。</p>
<p>下边看下第一个AD通道的情况,接一个电阻</p>
<p> </p>
<p> /* 单通道采样:选择adc通道0做采样,对应 PA4引脚, 带数据校准功能 */<br />
PRINT( "\n2.Single channel sampling...\n" );<br />
GPIOA_ModeCfg( GPIO_Pin_4, GPIO_ModeIN_Floating );<br />
ADC_ExtSingleChSampInit( SampleFreq_3_2, ADC_PGA_0 );</p>
<p> GPIOA_ModeCfg( GPIO_Pin_5, GPIO_ModeIN_Floating );<br />
RoughCalib_Value = ADC_DataCalib_Rough(); // 用于计算ADC内部偏差,记录到全局变量 RoughCalib_Value中<br />
PRINT( "RoughCalib_Value =%d \n", RoughCalib_Value );</p>
<p> ADC_ChannelCfg( 0 );</p>
<p> for( i = 0; i < 20; i++ )<br />
{<br />
abcBuff = ADC_ExcutSingleConver() + RoughCalib_Value; // 连续采样20次<br />
}<br />
for( i = 0; i < 20; i++ )<br />
{<br />
PRINT( "%d \n", abcBuff ); // 注意:由于ADC内部偏差的存在,当采样电压在所选增益范围极限附近的时候,可能会出现数据溢出的现象<br />
}</p>
kangkls 发表于 2022-3-12 13:59
估计是程序运行,芯片温度升高,AD采样值从2805到2811,整体增加了,这样的话,12位的AD只能用9位了吧
<p>有跳动很正常,电源、外部干扰这些都会影响ADC的测量。你把AD值转换成对应的温度看看,感觉读取的不像温度呢。</p> littleshrimp 发表于 2022-3-12 15:37
有跳动很正常,电源、外部干扰这些都会影响ADC的测量。你把AD值转换成对应的温度看看,感觉读取的不像温 ...
<p>Start @ChipID=82</p>
<p>1.Temperature sampling...<br />
第1次采样的AD数值2802 对应的温度3 <br />
第2次采样的AD数值2804 对应的温度4 <br />
第3次采样的AD数值2804 对应的温度4 <br />
第4次采样的AD数值2802 对应的温度3 <br />
第5次采样的AD数值2805 对应的温度4 <br />
第6次采样的AD数值2804 对应的温度4 <br />
第7次采样的AD数值2801 对应的温度3 <br />
第8次采样的AD数值2802 对应的温度3 <br />
第9次采样的AD数值2804 对应的温度4 <br />
第10次采样的AD数值2805 对应的温度4 <br />
第11次采样的AD数值2805 对应的温度4 <br />
第12次采样的AD数值2802 对应的温度3 <br />
第13次采样的AD数值2804 对应的温度4 <br />
第14次采样的AD数值2802 对应的温度3 <br />
第15次采样的AD数值2804 对应的温度4 <br />
第16次采样的AD数值2804 对应的温度4 <br />
第17次采样的AD数值2801 对应的温度3 <br />
第18次采样的AD数值2804 对应的温度4 <br />
第19次采样的AD数值2802 对应的温度3 <br />
第20次采样的AD数值2805 对应的温度4 </p>
littleshrimp 发表于 2022-3-12 15:37
有跳动很正常,电源、外部干扰这些都会影响ADC的测量。你把AD值转换成对应的温度看看,感觉读取的不像温 ...
<p>对应的程序</p>
<p> /* 温度采样并输出, 包含数据校准 */<br />
PRINT( "\n1.Temperature sampling...\n" );<br />
ADC_InterTSSampInit();<br />
RoughCalib_Value = ADC_DataCalib_Rough(); // 用于计算ADC内部偏差,记录到变量 RoughCalib_Value中,注意这个变量需要定义为有符号变量</p>
<p> for( i = 0; i < 20; i++ )<br />
{<br />
abcBuff = ADC_ExcutSingleConver() + RoughCalib_Value; // 连续采样20次<br />
}<br />
for( i = 0; i < 20; i++ )<br />
{<br />
PRINT( "第%d次采样的AD数值%d 对应的温度%d \n", (i+1),abcBuff,ADC_GetCurrentTS(abcBuff) );<br />
}</p>
<p>这个3度,4度,我认为也是不对,应该再有个校正值。</p>
<p>又读了两次温度</p>
<p><br />
1.Temperature sampling...<br />
第1次采样的AD数值2811 对应的温度5 <br />
第2次采样的AD数值2810 对应的温度5 <br />
第3次采样的AD数值2809 对应的温度5 <br />
第4次采样的AD数值2813 对应的温度5 <br />
第5次采样的AD数值2811 对应的温度5 <br />
第6次采样的AD数值2810 对应的温度5 <br />
第7次采样的AD数值2813 对应的温度5 <br />
第8次采样的AD数值2811 对应的温度5 <br />
第9次采样的AD数值2811 对应的温度5 <br />
第10次采样的AD数值2809 对应的温度5 <br />
第11次采样的AD数值2815 对应的温度6 <br />
第12次采样的AD数值2809 对应的温度5 <br />
第13次采样的AD数值2808 对应的温度5 <br />
第14次采样的AD数值2811 对应的温度5 <br />
第15次采样的AD数值2811 对应的温度5 <br />
第16次采样的AD数值2812 对应的温度5 <br />
第17次采样的AD数值2814 对应的温度5 <br />
第18次采样的AD数值2811 对应的温度5 <br />
第19次采样的AD数值2814 对应的温度5 <br />
第20次采样的AD数值2813 对应的温度5 <br />
Start @ChipID=82</p>
<p>1.Temperature sampling...<br />
第1次采样的AD数值2810 对应的温度5 <br />
第2次采样的AD数值2807 对应的温度5 <br />
第3次采样的AD数值2812 对应的温度5 <br />
第4次采样的AD数值2815 对应的温度6 <br />
第5次采样的AD数值2812 对应的温度5 <br />
第6次采样的AD数值2810 对应的温度5 <br />
第7次采样的AD数值2811 对应的温度5 <br />
第8次采样的AD数值2815 对应的温度6 <br />
第9次采样的AD数值2810 对应的温度5 <br />
第10次采样的AD数值2812 对应的温度5 <br />
第11次采样的AD数值2811 对应的温度5 <br />
第12次采样的AD数值2810 对应的温度5 <br />
第13次采样的AD数值2814 对应的温度5 <br />
第14次采样的AD数值2812 对应的温度5 <br />
第15次采样的AD数值2811 对应的温度5 <br />
第16次采样的AD数值2810 对应的温度5 <br />
第17次采样的AD数值2811 对应的温度5 <br />
第18次采样的AD数值2815 对应的温度6 <br />
第19次采样的AD数值2812 对应的温度5 <br />
第20次采样的AD数值2810 对应的温度5 <br />
</p>
kangkls 发表于 2022-3-12 22:01
这个3度,4度,我认为也是不对,应该再有个校正值。
<p>我觉得更像是你的通道没选对,测量到的可能是一个悬空的AD输入引脚。</p> kangkls 发表于 2022-3-12 22:04
又读了两次温度
1.Temperature sampling...
第1次采样的AD数值2811 对应的温度5
第2次采样的A ...
<p>或者你测量时用手机或者其他东西加热芯片,看看温度有没有明显变化。</p> littleshrimp 发表于 2022-3-12 22:35
我觉得更像是你的通道没选对,测量到的可能是一个悬空的AD输入引脚。
<p>芯片内置温度传感器温度,程序如下,都是例程。</p>
<p> </p>
<p>/* 温度采样并输出, 包含数据校准 */<br />
PRINT( "\n1.Temperature sampling...\n" );<br />
ADC_InterTSSampInit();<br />
RoughCalib_Value = ADC_DataCalib_Rough(); // 用于计算ADC内部偏差,记录到变量 RoughCalib_Value中,注意这个变量需要定义为有符号变量</p>
<p> for( i = 0; i < 20; i++ )<br />
{<br />
abcBuff = ADC_ExcutSingleConver() + RoughCalib_Value; // 连续采样20次<br />
}<br />
for( i = 0; i < 20; i++ )<br />
{<br />
PRINT( "第%d次采样的AD数值%d 对应的温度%d \n", (i+1),abcBuff,ADC_GetCurrentTS(abcBuff) );<br />
}</p>
<p> </p>
<p> </p>
<p> </p>
<p>/*******************************************************************************<br />
* Function Name : ADC_InterTSSampInit<br />
* Description : 内置温度传感器采样初始化<br />
* Input : None<br />
* Return : None<br />
*******************************************************************************/<br />
void ADC_InterTSSampInit( void )<br />
{<br />
R8_TKEY_CFG &= ~RB_TKEY_PWR_ON;<br />
R8_TEM_SENSOR = RB_TEM_SEN_PWR_ON;<br />
R8_ADC_CHANNEL = CH_INTE_VTEMP;<br />
R8_ADC_CFG = RB_ADC_POWER_ON \<br />
|RB_ADC_DIFF_EN \<br />
|( 3<<4 ) ;<br />
}</p>
kangkls 发表于 2022-3-13 10:40
芯片内置温度传感器温度,程序如下,都是例程。
/* 温度采样并输出, 包含数据校准 */
&nb ...
<p>例程里直接输出温度了吗?看一下是不是转换温度计算有误,或者加热芯片看一下温度变化是不是正常。</p>
littleshrimp 发表于 2022-3-13 18:27
例程里直接输出温度了吗?看一下是不是转换温度计算有误,或者加热芯片看一下温度变化是不是正常。
<p>由这个函数实现温度转换ADC_GetCurrentTS,都是自带例程的函数,未做更改<br />
/*******************************************************************************<br />
* Function Name : ADC_GetCurrentTS<br />
* Description : 获取当前采样的温度值(℃)<br />
* Input : ts_v:当前温度传感器采样输出<br />
* Return : 转换后的温度值(℃)<br />
*******************************************************************************/<br />
int ADC_GetCurrentTS( UINT16 ts_v )<br />
{<br />
int C25;<br />
int cal;</p>
<p> C25 = (*((PUINT32)ROM_CFG_TMP_25C));<br />
cal = ( ( (ts_v * 1050) + 2048 ) >> 12 ) + ( 1050 >> 1 );<br />
cal = 25 + ((cal - C25)*10/14);<br />
return ( cal );<br />
}<br />
</p>
kangkls 发表于 2022-3-13 21:15
由这个函数实现温度转换ADC_GetCurrentTS,都是自带例程的函数,未做更改
/*************************** ...
<p>你实验的环境温度真的只有5摄氏度左右吗?</p> littleshrimp 发表于 2022-3-13 21:31
你实验的环境温度真的只有5摄氏度左右吗?
<p>肯定不是5度,至少15度吧。</p>
<p> </p>
littleshrimp 发表于 2022-3-13 21:31
你实验的环境温度真的只有5摄氏度左右吗?
<p>厂家说这个是个相对值,不是绝对值</p>
<p>我原来也做过内部温度转换,厂家说,这个较正还在开发中。。。。</p>
<p>582ad测温在绝对温度上目前还需要自己手动校准,如测试转换出的数据为5度,而实际温度为15度,则将结果加10.另外关于ad是12位是全部用到了不,只是在测温的时候你温度达不到那么高,可以测量电压值试试。</p>
页:
[1]
2