本帖最后由 gaoyang9992006 于 2022-12-12 14:22 编辑
测温电路如上所示,将OUT接入开发板的ADC接口,比如接入AIN2
接下来配置ADC,先设置ADC的时钟,然后配置IO端口作为ADC输入端口,然后选择该端口的通道切入ADC转化通路,然后使能ADC中断功能用于识别转化完成否,然后打开ADC功能开关。
接下来通过转换启动功能启动,然后通过中断寄存器判断是否完成转换,如果转换完成清理对应标志位,读取转换的结果。
根据转换的结果计算阻值,通过阻值计算温度。
#include<rd8_conf.h>
#include<stdio.h>
#include <math.h>
#define K 273.15
#define T0 (25.0+K)
#define R0 10000.0
#define B 3455.0
float Res_to_Tem(float res_val)
{
float temp;
temp=1/((1/T0)+(log(res_val/R0)/B));
return temp-K;
}
void SC_Init(void)
{
GPIO_Init(GPIO0, GPIO_PIN_1, GPIO_MODE_OUT_PP); //设置P01为强推挽模式
GPIO_Init(GPIO1, GPIO_PIN_ALL, GPIO_MODE_IN_PU); //设置P1为高阻输入模式
GPIO_Init(GPIO1, GPIO_PIN_1,GPIO_MODE_IN_PU);
GPIO_Init(GPIO1, GPIO_PIN_3,GPIO_MODE_IN_PU);
USCI1_ITConfig(DISABLE,LOW);
USCI1_UART_Init(32000000,115200,USCI1_UART_Mode_10B,USCI1_UART_RX_ENABLE);
ADC_Init(ADC_PRESSEL_3CLOCK,ADC_Cycle_Null);
ADC_EAINConfig(ADC_EAIN_2,ENABLE);
ADC_ChannelConfig(ADC_CHANNEL_2, ENABLE);
ADC_ITConfig(ENABLE, LOW);
ADC_Cmd(ENABLE);
}
//重写Printf发送函数
char putchar (char c)
{
USCI1_UART_SendData8(c);
while(!USCI1_GetFlagStatus(USCI1_UART_FLAG_TI));
USCI1_ClearFlag(USCI1_UART_FLAG_TI);
return c;
}
void Delay(unsigned int time)
{
unsigned int Single_Time;
while(time--)
{
Single_Time = 4095;
while(Single_Time --);
}
}
void main(void)
{
uint16_t adc_val=0;
uint16_t Res_val=0;
float temp=0.0;
SC_Init();
while(1)
{
GPIO_TogglePin(GPIO0, GPIO_PIN_1);
ADC_StartConversion(); //开启一次ADC转换
while(!ADC_GetFlagStatus()); //等待ADC转换结束
ADC_ClearFlag();
adc_val = ADC_GetConversionValue();
Res_val=(adc_val*6200.0)/(4095-adc_val);
temp=Res_to_Tem(Res_val);
Delay(2000);
printf("adc_val = %d\n",adc_val);
printf("Rx=%d Ohm\n",Res_val);
printf("Temp=%.2f ℃\n",temp);
printf("---------------------------\n");
}
}
|