124 lines
3.7 KiB
C
124 lines
3.7 KiB
C
/*
|
|
* ADC.c
|
|
*
|
|
* Created on: 2022年3月22日
|
|
* Author: User
|
|
*/
|
|
|
|
#include <Main.h>
|
|
|
|
uint16_t volatile Channel = 0; // ADC通道位
|
|
uint16_t xdata Temp_Array[2][10] = {0}; //两个通道的10次缓存值
|
|
|
|
uint8_t count = 0; //转换次数计数
|
|
uint16_t Display1_Array[5] = {0};
|
|
uint16_t Display2_Array[5] = {0};
|
|
static void ADC_Init(void); //初始化函数
|
|
static void Get_ADCData(void); //把读到的AD值转成温度
|
|
void Delay_2us(uint16_t fui_i);
|
|
ADC_t ADC = {
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
ADC_Init, // ADC初始化
|
|
Get_ADCData, //转换读到的值
|
|
};
|
|
/*
|
|
* @name ADC_Init
|
|
* @brief ADC初始化函数
|
|
* @param None
|
|
* @retval None
|
|
*/
|
|
static void ADC_Init(void)
|
|
{
|
|
// P0M1 = P0M1 & 0x0F | 0x30;
|
|
// ADCC0 = 0x81; //打开ADC电源 选择内部基准电压VREF 选择内部4V基准电压
|
|
ADCC0 = 0x84; //打开ADC电源 选择外部基准电压VREF
|
|
Delay_2us(10); // 延时20微秒等待稳定
|
|
ADCC1 = 0x0D; //打开外部通道3
|
|
|
|
ADCC2 = 0x6D; // ADC转换结果12位 数据右对其 16分频
|
|
IE1 |= 0x20; //打开ADC中断
|
|
EA = 1; //打开总中断
|
|
ADCC0 &= ~0x20; //清除转换完成标志位
|
|
Channel = Temp1_CHANNEL;
|
|
ADCC1 = (ADCC1 & (~0x07)) | Channel; //切换通道通道
|
|
ADCC0 |= 0x40; //启动ADC转换
|
|
}
|
|
static void Get_ADCData(void) //转换读出的AD值
|
|
{
|
|
static uint16_t Temp1 = 0, Temp2 = 0;
|
|
static uint8_t count = 0;
|
|
Temp1 = Temp_Array[0][0] + Temp_Array[0][1] + Temp_Array[0][2] + Temp_Array[0][3] + Temp_Array[0][4] + Temp_Array[0][5] + Temp_Array[0][6] + Temp_Array[0][7] + Temp_Array[0][8] + Temp_Array[0][9];
|
|
Temp1 = Temp1 / 10; //求10次平均值
|
|
ADC.Temp1_Result = (Temp1 * 5 / 4.095 + 5) / 10; //四舍五入转换为温度 内部4V基准电压 采集为分压后电压的一半
|
|
Temp1 = 0;
|
|
|
|
Temp2 = Temp_Array[1][0] + Temp_Array[1][1] + Temp_Array[1][2] + Temp_Array[1][3] + Temp_Array[1][4] + Temp_Array[1][5] + Temp_Array[1][6] + Temp_Array[1][7] + Temp_Array[1][8] + Temp_Array[1][9];
|
|
Temp2 = Temp2 / 10; //求10次平均值
|
|
ADC.Temp2_Result = (Temp2 * 5 / 4.095 + 5) / 10; //四舍五入转换为温度 内部4V基准电压 采集为分压后电压的一半
|
|
Temp2 = 0;
|
|
if (Timer0.ADC_Timer >= TIMER0_80mS)
|
|
{
|
|
Timer0.ADC_Timer = 0;
|
|
Display1_Array[count] = ADC.Temp1_Result;
|
|
Display2_Array[count] = ADC.Temp2_Result;
|
|
count++;
|
|
}
|
|
|
|
if (count >= 5)
|
|
{
|
|
count = 0;
|
|
Temp1 = Display1_Array[0] + Display1_Array[1] + Display1_Array[2] + Display1_Array[3] + Display1_Array[4];
|
|
ADC.Display_Temp1_Value = (float)Temp1 / 5 + 0.5;
|
|
Temp2 = Display2_Array[0] + Display2_Array[1] + Display2_Array[2] + Display2_Array[3] + Display2_Array[4];
|
|
ADC.Display_Temp2_Value = (float)Temp2 / 5 + 0.5;
|
|
Temp1 = 0;
|
|
Temp2 = 0;
|
|
}
|
|
}
|
|
|
|
/*
|
|
* @name ADC_Rpt
|
|
* @brief ADC中断函数
|
|
* @param None
|
|
* @retval None
|
|
*/
|
|
void ADC_Rpt() interrupt ADC_VECTOR
|
|
{
|
|
ADCC0 &= ~0x20; //清除ADC中断标志位
|
|
if (Channel == Temp1_CHANNEL) //通道13
|
|
{
|
|
|
|
Temp_Array[0][count] = ADCR;
|
|
Channel = Temp2_CHANNEL; //切换通道
|
|
}
|
|
else if (Channel == Temp2_CHANNEL) //通道12
|
|
{
|
|
Temp_Array[1][count] = ADCR;
|
|
Channel = Temp1_CHANNEL; //切换通道
|
|
count++;
|
|
}
|
|
|
|
if (count >= 10) //循环读10次
|
|
count = 0;
|
|
ADCC1 = (ADCC1 & (~0x07)) | Channel; //切换通道通道
|
|
Delay_2us(10); //切换通道后建议延时20us
|
|
ADCC0 |= 0x40; //启动下一次转换
|
|
}
|
|
|
|
/*
|
|
* @name Delay_2us
|
|
* @brief 延时2us函数
|
|
* @param fui_i
|
|
* @retval None
|
|
*/
|
|
void Delay_2us(uint16_t fui_i)
|
|
{
|
|
while (fui_i--)
|
|
;
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////
|