事情是这样的,小弟在淘宝上买了一块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输出引脚了。。。
|