【CH579M-R1】3. ADC 内部测温,外部通道及触摸按键 测试
[复制链接]
本帖最后由 yanxinboy 于 2020-9-25 20:20 编辑
节前加月底,巨忙中!
CH579内部集成了一个12位的逐次逼近型模拟数字转换器ADC,最大16个通道,支持14个外部模拟信号源和2个内部信号源 - 内部温度检测通道和内部电池电压检测通道。
输入支持单端和差分输入,可选PGA增益(建议按手册的实际可用测量范围选择合适的PGA增益,提高准确度)。
ADC 时钟频率选择为CK32M的6,8,10,12分频,频率范围在2.67MHz~5.33MHz之间,采样速率为始终频率的1/16, 理解为16个始终周期完成一次采样。这个分辨率和速度,完全能满足一般的模拟量的采集应用。
下面是ADC的结构框图及寄存器列表供快速参考:
本此实验对ADC的单通道,内部温度检测,触摸按键检测进行了测试:
硬件连接: 外部通道分别测试了ADC 通道9 - PA0, ADC 通道3 - PA13, 其中PA0接3.3V, PA13同样连接3.3V.
ADC 参考了库函数的数据校准功能,手册里面对PGA 增益的选择描述。 触摸按键使用了430BOOST-SENSE1. 连接至ADC通道2 - PA12.
实验程序如下:
int main()
{
UINT8 i;
signed short RoughCalib_Value=0;
RB_CFG_RESET_EN;
DebugInit();
PRINT( "Start @ChipID=%02X\n", R8_CHIP_ID );
PRINT( "\n1.Temperature sampling...\n");
ADC_InterTSSampInit();
RoughCalib_Value = ADC_DataCalib_Rough();
for(i=0; i<20; i++)
{
abcBuff[i] = ADC_ExcutSingleConver() + RoughCalib_Value;
}
for(i=0; i<20; i++)
{
PRINT("%u 'c ", ADC_GetCurrentTS( abcBuff[i] ));
}PRINT("\n");
PRINT( "\n2.Single channel sampling...\n");
GPIOA_ModeCfg(GPIO_Pin_0, GPIO_ModeIN_Floating);
ADC_ExtSingleChSampInit( SampleFreq_3_2, ADC_PGA_0 );
GPIOA_ModeCfg(GPIO_Pin_5, GPIO_ModeIN_Floating);
RoughCalib_Value = ADC_DataCalib_Rough();
PRINT("=%d \n", RoughCalib_Value);
ADC_ChannelCfg( 9 );
for(i=0; i<20; i++)
{
abcBuff[i] = ADC_ExcutSingleConver() + RoughCalib_Value;
ADC_DataCalib_Fine( &abcBuff[i], ADC_PGA_0 );
}
for(i=0; i<20; i++)
{
PRINT("%f V ", ((float)(abcBuff[i]))/4096*3.3);
}PRINT("\n");
PRINT( "\n4.TouchKey sampling...\n");
GPIOA_ModeCfg(GPIO_Pin_12, GPIO_ModeIN_Floating);
TouchKey_ChSampInit();
ADC_ChannelCfg( 2 );
for(i=0; i<20; i++)
{
abcBuff[i] = TouchKey_ExcutSingleConver(0x20);
}
for(i=0; i<20; i++)
{
PRINT("%d ", abcBuff[i]);
}PRINT("\n");
PRINT( "\n4.Single channel sampling in interrupt mode...\n");
GPIOA_ModeCfg(GPIO_Pin_13, GPIO_ModeIN_Floating);
ADC_ExtSingleChSampInit( SampleFreq_3_2, ADC_PGA_0 );
ADC_ChannelCfg( 3 );
NVIC_EnableIRQ(ADC_IRQn);
adclen = 0;
ADC_StartUp();
while(adclen < 20);
NVIC_DisableIRQ(ADC_IRQn);
for(i=0; i<20; i++)
{
PRINT("%f V ", ((float)(abcBuff[i]))/4096*3.3);
}PRINT("\n");
while(1);
}
void ADC_IRQHandler(void)
{
if(ADC_GetITStatus())
{
abcBuff[adclen] = ADC_ReadConverValue();
ADC_StartUp();
adclen ++;
}
}
实验数据串口输出如下, 其中触摸按键为非触摸状态和触摸状态的数值,感觉变化不大啊。沁恒的手册也没有过多的关于触摸的设置,PCB布局等的技术描述。这个可能只有项目需求时再与官方沟通获得更多的技术资料了。如果有触摸调试好用的同学麻烦指点下,目前的数据是否合理。
同时我们看到ADC在使用PGA增益校准后,实际效果并没有直接采样取得的数值准确。沁恒的参考程序,要求使用粗细调时,浮空ADC1, 目前收到的板子ADC1及PA5连接至USB部分,可能对采样有影响。 需要与官方沟通了解下。 这个校准怎么用,知道的同学指点下哦。
总至,ADC内部温度采样可用, 外部采样速度和精度应该满足一般的使用。触摸按键上还需要与官方沟通获取其他一手的信息。 示例程序里面有差分采样, 暂时不方便未测试。
继续调蓝牙中, 谢谢大家!
Thanks for watching! 中秋快乐,国庆快乐!
|