本帖最后由 taijing33 于 2022-6-9 15:53 编辑
我按照厂家提供的例子,自己改的程序。使用了9路adc口,
P1_MODE_IN_HIZ( GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5| GPIO_Pin_6);
P0_MODE_IN_HIZ( GPIO_Pin_5 | GPIO_Pin_6); //P0.0~P0.6 ÉèÖÃΪ¸ß×èÊäÈë
然后adc功能和dma初始化 如下
#define ADC_CH 9 /* 1~16, ADC转换通道数, 需同步修改转换通道 */
#define ADC_DATA 68 /* 6~n, 每个通道ADC转换数据总数, 2*转换次数+4, 需同步修改转换次数 */
#define BMM_ADDR 0x800 /* BMMÊý¾Ý´æ·ÅµØÖ· */
/************* ±¾µØ±äÁ¿ÉùÃ÷ **************/
bit BmmFlag;
u8 xdata BmmAdBuffer[ADC_CH][ADC_DATA] ;
void BMM_AD_init(void)
{
ADC_InitTypeDef ADC_InitStructure; //????
BMM_ADC_InitTypeDef BMM_ADC_InitStructure; //????
//----------------------------------------------
P1_MODE_IN_HIZ( GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5| GPIO_Pin_6);
P0_MODE_IN_HIZ( GPIO_Pin_5 | GPIO_Pin_6); //P0.0~P0.6 ÉèÖÃΪ¸ß×èÊäÈë
//----------------------------------------------
ADC_InitStructure.ADC_SMPduty = 31; //ADC 模拟信号采样时间控制, 0~31(注意: SMPDUTY 一定不能设置小于 10)
ADC_InitStructure.ADC_CsSetup = 0; //ADC 通道选择时间控制 0(默认),1
ADC_InitStructure.ADC_CsHold = 1; //ADC 通道选择保持时间控制 0,1(默认),2,3
ADC_InitStructure.ADC_Speed = ADC_SPEED_2X1T; //设置 ADC 工作时钟频率 ADC_SPEED_2X1T~ADC_SPEED_2X16T
ADC_InitStructure.ADC_AdjResult = ADC_RIGHT_JUSTIFIED; //ADC结果调整, ADC_LEFT_JUSTIFIED,ADC_RIGHT_JUSTIFIED
ADC_Inilize(&ADC_InitStructure); //初始化
ADC_PowerControl(ENABLE); //ADC电源开关, ENABLE或DISABLE
NVIC_ADC_Init(DISABLE,Priority_0); //中断使能, ENABLE/DISABLE; 优先级(低到高) Priority_0,Priority_1,Priority_2,Priority_3
//----------------------------------------------
BMM_ADC_InitStructure.BMM_Enable = ENABLE; //BMM使能 ENABLE,DISABLE
BMM_ADC_InitStructure.BMM_Channel = 0x607f; //ADC通道使能寄存器, 1:使能, bit15~bit0 对应 ADC15~ADC0;0x607f一共使能了9个adc通道
BMM_ADC_InitStructure.BMM_Buffer = BmmAdBuffer; //ADC转换数据存储地址
BMM_ADC_InitStructure.BMM_Times = ADC_32_Times; //每个通道转换次数, ADC_1_Times,ADC_2_Times,ADC_4_Times,ADC_8_Times,ADC_16_Times,ADC_32_Times,ADC_64_Times,ADC_128_Times,ADC_256_Times
BMM_ADC_Inilize(&BMM_ADC_InitStructure); //初始化
NVIC_BMM_ADC_Init(ENABLE,Priority_0,Priority_0); //中断使能, ENABLE/DISABLE; 优先级(低到高) Priority_0~Priority_3; 总线优先级(低到高) Priority_0~Priority_3
BMM_ADC_TRIG(); //触发启动转换
}
取值操作方法如下
if(BmmFlag == 1)
{
BmmFlag = 0;RUN_LED = !RUN_LED;
tempvalue1 = BmmAdBuffer[7][66];
tempvalue1 = (tempvalue1 <<8 )+ BmmAdBuffer[7][67];
tempvalue2 = BmmAdBuffer[8][66];
tempvalue2 = (tempvalue2 <<8 )+ BmmAdBuffer[8][67];
tempvalue3 = BmmAdBuffer[0][66];
tempvalue3 = (tempvalue3 <<8 )+ BmmAdBuffer[0][67];
tempvalue4 = BmmAdBuffer[1][66];
tempvalue4 = (tempvalue4 <<8 )+ BmmAdBuffer[1][67];
BMM_ADC_TRIG();
}
其中tempvalue1 tempvalue2 tempvalue3 tempvalue4 是外部4路ntc测温的adc值。
现在只有tempvalue3 tempvalue4是正确的,tempvalue1 tempvalue2严重不对,而且在外部ntc未接的情况下,整个io悬空的情况下
ADC13和adc14 IO口有1V左右的电压。
ADC13和adc14 对应的io口是p0.5和p0.6。
我不用dma功能的话,这2个io口的adc功能是正常的。,
|