事情是这样的,小弟在淘宝上买了一块min51的开发板,MCU是MINI54LAN,把MINI54LAN的第41个引脚(ADC CHEN0)跟一个也是淘宝上买的热敏电阻模块的模拟输出引脚相连,然后按照手册跟官网上载的代码配合起来把AD模块初始化了,然后启动转换并读取ADDR0的值,结果发现ADD0一直等于0x20000,也就是0~9这10位数据一直是0,不知道为什么啊。。。我的热敏电阻模块有3跟针脚,vcc gnd A0,VCC接MINI54LAN上的AVCC,GND接MINI54LAN上的GND,A0接MINI54LAN上的第41个引脚。。。热敏电阻模块原理图如下,AD模块初始化代码如下:void Init_ADC(void)
{
IPRSTC2 |= ADC_RST;//复位ADC外设
IPRSTC2 &= ~ADC_RST;//ADC模块从复位状态恢复到正常状态
APBCLK |= ADC_CLKEN;//使能ADC时钟
//选择外部晶振作为ADC时钟源
CLKSEL1 = CLKSEL1 & (~ADC_CLK) | ADC_12M_32K;
CLKDIV |= 0x00050000;//ADC时钟6分频
ADCR |= ADEN;//使能ADC
//选择ADC的0~7通道
//ADCHER |= (CHEN0|CHEN1|CHEN2|CHEN3|CHEN4|CHEN5|CHEN6|CHEN7);
ADCHER |= (CHEN0);
//AIN0
P5_MFP = P5_MFP & (~P53_MFSEL) | P53_AIN0;//配置P5.3为AD输入脚
P5_OFFD |= OFFD3;//关数字输入通路
P5_PMD = P5_PMD & (~Px3_PMD) | Px3_IN;//配置P5.3为输入模式
//AIN1
/* P5_MFP = P5_MFP & (~P52_MFSEL) | P52_INT1;
P5_OFFD |= OFFD2;
P5_PMD = P5_PMD & (~Px2_PMD) | Px2_IN;
//AIN6
P3_MFP = P3_MFP & (~P30_MFSEL) | P30_AIN6;
P3_OFFD |= OFFD0;
P3_PMD = P3_PMD & (~Px0_PMD) | Px0_IN; */
ADSR |= ADF;//清中断标志
ADCR |= ADIE;//使能ADC中断
NVIC_ISER = ADC_INT;//使能NVIC里ADC中断矢量
}
void Start_ADC(uint8_t u8CHEN)
{
ADCR |= ADST;//启动ADC
}
void ADC_IRQHandler(void)
{
static uint16_t u16ADCValue = 0;
uint8_t acBuff[20] ={0};
//清中断标志
ADSR |= ADF;
//读ADC结果
u16ADCValue = ADDR0 & 0x000003FF;
sprintf(acBuff,"the value %d\n", u16ADCValue);
Write_UART(acBuff, 128);
}
//main函数就初始化了AD模块,然后就启动转换,结果发现在AD中断的处理函数内读出来的数值都是0
热敏电阻模块原理图如下:
这边不知道怎么上图,反正就是把一个热敏电阻跟一个10K的电阻串联,然后两头一边接VCC一边接GND,然后在引出一根A0模拟量输出端,A0就接开发板的AD模块通道0输出引脚了。。。 |