2023-03-06 09:51:44 +08:00

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--)
;
}
/////////////////////////////////////////////////////////////////////////////////