本帖最后由 jinglixixi 于 2022-6-13 00:38 编辑
LKS08X系列芯片内集成了高速的12BIT ADC ,并可接入12路外部ADC输入通道。 此外,它还内置温度传感器,当温度在-40~85℃之间时,其精度为 2℃;当温度在85~105℃时,其精度为3℃。且在出厂前,已进行温度校正,其校正值保存在 flash info 区。 在上电后的默认状态下,该温度传感器是关闭的。若开启该传感器,需要先开启 BGP 模块。 温度传感器通过设置 TMPPDN=1 打开,开启到稳定需要约 2us,因此需在 ADC测量传感器之前 2us 打开。温度传感器的信号被连到 ADC 的通道 18。 温度校正后的温度传感器曲线如图1所示,其中X轴为温度传感器的温度信号所对应的 ADC 值, Y 轴为传感器所对应的温度。 图1 温度曲线 在测温时,通过读取ADC 值即可推算出温度,其对应的计算公式为: y=-0.6032x+364.96 实现片内温度检测的主程序为: uint32_t a = 0, b = 0;
uint32_t TEMP = 0;
extern int Voltage0_Value1;
int main(void)
{
Hardware_init(); // 硬件初始化
while (1)
{
SYS_AFE_REG5 |= BIT13; // 开启温度传感器
Read_More_Flash(0x00000398, 1, &a, 1); // 读NVR温度校正系数a程序
Read_More_Flash(0x0000039C, 1, &b, 1); // 读NVR温度校正系数b内程序
TEMP = (-((Voltage0_Value1 >> 4) * a / 10000)) + (b / 10); // 当前芯片温度单位℃
delay(0xffff0); // 延时
}
}
由于该检测程序并没有配置相应的显示输出功能,故在测试时只能在调试模式下通过查看变量值来解决。 为了能更直观地查看结果,可将该程序与前面介绍的串行数码管模块结合起来,其显示效果如图2所示。 图2 片内温度显示 实现该显示效果的主程序如下: uint32_t a = 0, b = 0;
uint32_t TEMP = 0;
extern int Voltage0_Value1;
int main(void)
{
uint8_t n;
Hardware_init();
smg_init();
GPIO_SetBits(GPIO1, GPIO_Pin_10);
GPIO_SetBits(GPIO1, GPIO_Pin_11);
Init_MAX7219();
delay(2000);
Write_Max7219(0x0f, 0x00);
Write_Max7219(1, 0x0f);
Write_Max7219(2, 0x0f);
Write_Max7219(3, 0x0f);
Write_Max7219(4, 0x0f);
Write_Max7219(5 ,0x0f);
Write_Max7219(6,0x0f);
Write_Max7219(7,0x0f);
Write_Max7219(8,0x0f);
while (1)
{
SYS_AFE_REG5 |= BIT13;
Read_More_Flash(0x00000398, 1, &a, 1);
Read_More_Flash(0x0000039C, 1, &b, 1);
TEMP = (-((Voltage0_Value1 >> 4) * a / 10000)) + (b / 10);
Write_Max7219(4,0x0f);
Write_Max7219(3,0x0f);
n=TEMP%100/10;
Write_Max7219(2,n);
n=TEMP%10;
Write_Max7219(1,n);
delay(0xffff0);
}
}
此外,由于数码管显示模块所使用的引脚为P1.10、P1.11及P0.4,它与例程中函数Hardware_init()的处理有一些重叠,故需要加以适当的修改。对应的方法不外乎2个,一个是修改数码管显示模块所占用的引脚,另一个就是排除引脚的冲突。相对来讲还是选取后者比较快捷,修改完成后其内容如下: void Hardware_init(void)
{
__disable_irq();
SYS_WR_PROTECT = 0x7a83;
FLASH_CFG |= 0x00080000;
ADC0_init();
NVIC_EnableIRQ(ADC0_IRQn);
NVIC_SetPriority(ADC0_IRQn, 2);
__enable_irq();
}
|