OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3633|回复: 2

ADC配置实在看不出问题,时间肯定也对的,一头雾水哪里出问题了呢

[复制链接]

164

主题

1230

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1477
金钱
1477
注册时间
2014-5-21
在线时间
342 小时
发表于 2015-9-17 12:07:56 | 显示全部楼层 |阅读模式
5金钱
代码在附件中,谁帮分析一下。MDK 5.14上开发 ,后来打印ADC1->DR寄存器发现数不对现在所有功能都去了只保留ADC来请大神检查问题, ADC1几个通道采样的值都完全错误还胡乱变化。

基于战舰mini开发板ADC采样问题求解.rar

3.37 MB, 下载次数: 8

彼高丽者,边夷贱类,不足待以仁义,不可责以常礼。古来以鱼鳖畜之,宜从阔略。若必欲绝其种类,恐兽穷则搏。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

164

主题

1230

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1477
金钱
1477
注册时间
2014-5-21
在线时间
342 小时
 楼主| 发表于 2015-9-17 12:08:54 | 显示全部楼层
[mw_shl_code=c,true]/********************************Copyright (c)***************************************** * XXXXXXXXXX电子技术有限公司 * 产品研发部 * * **---------文件信息-------------------------------------------------------------------- **文 件 名: bsp.c **创 建 人: XXXXXXXXXX **最后修改日期: 2015年09月14日 **描 述: 硬件外设配置 ***************************************************************************************/ #include "bsp.h" /******************************************************************************************************** ** 函数名称: ADC_DuCvTab ** 功能描述: ADC 转换结果缓存空间 ********************************************************************************************************/ u16 ADC_DuCvTab[ADC_DuCvTab_SIZE]; void BSP_Init(void) { RCC_Configuration(); SysTick_Configuration(); GPIO_Configuration(); ADC_Configuration();[/mw_shl_code] [mw_shl_code=c,true] DMA_Configuration(); USART_Configuration(115200); NVIC_Configuration(); } /******************************************************************************* * Function Name : RCC_Configuration * Description : Configures the different system clocks. * Input : None * Output : None * Return : None *******************************************************************************/ void RCC_Configuration(void) { ErrorStatus HSEStartUpStatus; /* RCC system reset(for debug purpose) */ RCC_DeInit(); /* Enable HSE */ RCC_HSEConfig(RCC_HSE_ON); /* Wait till HSE is ready */ HSEStartUpStatus = RCC_WaitForHSEStartUp(); if(HSEStartUpStatus == SUCCESS) { /* HCLK = SYSCLK */ RCC_HCLKConfig(RCC_SYSCLK_Div1); /* PCLK2 = HCLK/2 */ RCC_PCLK2Config(RCC_HCLK_Div1); /* PCLK1 = HCLK/2 */ RCC_PCLK1Config(RCC_HCLK_Div2); /* PLLCLK = 8MHz * 9 = 72 MHz */ RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); /* Enable PLL */ RCC_PLLCmd(ENABLE); /* Wait till PLL is ready */ while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET); /* Select PLL as system clock source */ RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); /* Wait till PLL is used as system clock source */ while(RCC_GetSYSCLKSource() != 0x08); } /* ADCCLK = PCLK2/4 */ RCC_ADCCLKConfig(RCC_PCLK2_Div4); /* Enable DMA1 clock */ RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC | RCC_APB2Periph_ADC1 | RCC_APB2Periph_ADC2 | RCC_APB2Periph_AFIO , ENABLE); /* TIM3 & USART3 clock enable */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3 | RCC_APB1Periph_USART3, ENABLE); } /******************************************************************************************************** ** 函数名称: GPIO_Configuration ** 功能描述: GPIO功能配置 ** 输  入: 无 ** 输  出: 无 ** 返 回: 无 ** 全局变量: 无 ** 调用模块: 无 ********************************************************************************************************/ void GPIO_Configuration(void) { GPIO_InitTypeDef GPIO_InitStructure; /* Configure USART3 Tx (PB.10) */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); /* Configure USART3 Rx (PB.11) */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOB, &GPIO_InitStructure); /*系统模拟量输入引脚*/ GPIO_InitStructure.GPIO_Pin = ACC_X_PIN | ACC_Y_PIN | ACC_Z_PIN \ | LEADII_PIN | LEADI_PIN | LEADV_PIN | VBT_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = VREF_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; GPIO_Init(GPIOC, &GPIO_InitStructure); /*非ADC输入*/ GPIO_InitStructure.GPIO_Pin = S1_PIN| LDO6_PIN | LDO5_PIN| LDO1_PIN| LDO2_PIN;/*电源开关&导联脱落*/ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = LDO2_PIN| LDO3_PIN;/*导联脱落*/ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_Init(GPIOC, &GPIO_InitStructure); } void ADC_Configuration(void) { ADC_InitTypeDef ADC_InitStructure; /* ADC1 Configuration ------------------------------------------------------*/ ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; ADC_InitStructure.ADC_ScanConvMode = ENABLE; ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; ADC_InitStructure.ADC_NbrOfChannel = 8; ADC_Init(ADC1, &ADC_InitStructure); /* ADC1 Regular channels configuration */ ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_13Cycles5); ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 2, ADC_SampleTime_13Cycles5); ADC_RegularChannelConfig(ADC1, ADC_Channel_3, 3, ADC_SampleTime_13Cycles5); ADC_RegularChannelConfig(ADC1, ADC_Channel_4, 4, ADC_SampleTime_13Cycles5); ADC_RegularChannelConfig(ADC1, ADC_Channel_5, 5, ADC_SampleTime_13Cycles5); ADC_RegularChannelConfig(ADC1, ADC_Channel_6, 6, ADC_SampleTime_13Cycles5); ADC_RegularChannelConfig(ADC1, ADC_Channel_7, 7, ADC_SampleTime_13Cycles5); ADC_RegularChannelConfig(ADC1, ADC_Channel_14,8, ADC_SampleTime_13Cycles5); /* Enable ADC1 DMA */ ADC_DMACmd(ADC1, ENABLE); /* Enable ADC1 */ ADC_Cmd(ADC1, ENABLE); /* Enable ADC1 reset calibaration register */ ADC_ResetCalibration(ADC1); /* Check the end of ADC1 reset calibration register */ while(ADC_GetResetCalibrationStatus(ADC1)); /* Start ADC1 calibaration */ ADC_StartCalibration(ADC1); /* Check the end of ADC1 calibration */ while(ADC_GetCalibrationStatus(ADC1)); } //void ADC_Configuration(void) //{ // ADC_InitTypeDef ADC_InitStructure; // /* ADC1 Configuration ------------------------------------------------------*/ // //ADC_InitStructure.ADC_Resolution = ADC_Resolution_8b; // ADC_InitStructure.ADC_Mode = ADC_Mode_RegSimult; // ADC_InitStructure.ADC_ScanConvMode = ENABLE; // ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; // ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; // ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; // ADC_InitStructure.ADC_NbrOfChannel = 4; // ADC_Init(ADC1, &ADC_InitStructure); // /* ADC1 Regular channels configuration */ // ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_55Cycles5); // ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 2, ADC_SampleTime_55Cycles5); // ADC_RegularChannelConfig(ADC1, ADC_Channel_3, 3, ADC_SampleTime_55Cycles5); // ADC_RegularChannelConfig(ADC1, ADC_Channel_4, 4, ADC_SampleTime_55Cycles5); // /* Enable ADC1 DMA */ // ADC_DMACmd(ADC1, ENABLE); // // /* ADC2 Configuration ------------------------------------------------------*/ // ADC_InitStructure.ADC_Mode = ADC_Mode_RegSimult; // ADC_InitStructure.ADC_ScanConvMode = ENABLE; // ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; // ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; // ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; // ADC_InitStructure.ADC_NbrOfChannel = 4; // ADC_Init(ADC2, &ADC_InitStructure); // /* ADC2 Regular channels configuration */ // ADC_RegularChannelConfig(ADC1, ADC_Channel_5, 1, ADC_SampleTime_55Cycles5); // ADC_RegularChannelConfig(ADC1, ADC_Channel_6, 2, ADC_SampleTime_55Cycles5); // ADC_RegularChannelConfig(ADC1, ADC_Channel_7, 3, ADC_SampleTime_55Cycles5); // ADC_RegularChannelConfig(ADC2, ADC_Channel_14,4, ADC_SampleTime_55Cycles5); // /* Enable ADC1 */ // ADC_Cmd(ADC1, ENABLE); // /* Enable ADC1 reset calibaration register */ // ADC_ResetCalibration(ADC1); // /* Check the end of ADC1 reset calibration register */ // while(ADC_GetResetCalibrationStatus(ADC1)); // /* Start ADC1 calibaration */ // ADC_StartCalibration(ADC1); // /* Check the end of ADC1 calibration */ // while(ADC_GetCalibrationStatus(ADC1)); // /* Enable ADC2 */ // ADC_Cmd(ADC2, ENABLE); // /* Enable ADC2 reset calibaration register */ // ADC_ResetCalibration(ADC2); // /* Check the end of ADC2 reset calibration register */ // while(ADC_GetResetCalibrationStatus(ADC2)); // /* Start ADC2 calibaration */ // ADC_StartCalibration(ADC2); // /* Check the end of ADC2 calibration */ // while(ADC_GetCalibrationStatus(ADC2)); // /* Enable ADC2 external trigger conversion */ // ADC_ExternalTrigConvCmd(ADC2, ENABLE); //} /******************************************************************************* * Function Name : DMA_Configuration * Description : Configure the ADC_DMA. * Input : None * Output : None * Return : None *******************************************************************************/ void DMA_Configuration(void) { DMA_InitTypeDef DMA_InitStructure; /* DMA1 channel1 configuration ----------------------------------------------*/ DMA_DeInit(DMA1_Channel1); DMA_InitStructure.DMA_PeripheralBaseAddr =(uint32_t)&ADC1->DR; DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)ADC_DuCvTab; DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; DMA_InitStructure.DMA_BufferSize = ADC_DuCvTab_SIZE; DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; DMA_InitStructure.DMA_MemoryDataSize = DMA_PeripheralDataSize_HalfWord; DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; DMA_InitStructure.DMA_Priority = DMA_Priority_High; DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; DMA_Init(DMA1_Channel1, &DMA_InitStructure); /* Enable DMA1 Channel1 */ DMA_Cmd(DMA1_Channel1, ENABLE); /* Enable DMA1 Channel1 Transfer interrupt */ DMA_ITConfig(DMA1_Channel1, DMA_IT_TC | DMA_IT_HT | DMA_IT_TE , ENABLE); } /******************************************************************************* * Function Name : USART_Configuration * Description : Configure the USART3. * Input : None * Output : None * Return : None *******************************************************************************/ void USART_Configuration(u32 Bound) { USART_InitTypeDef USART_InitStructure; USART_ClockInitTypeDef USART_ClockInitStructure; USART_ClockInitStructure.USART_Clock = USART_Clock_Disable; USART_ClockInitStructure.USART_CPOL = USART_CPOL_Low; USART_ClockInitStructure.USART_CPHA = USART_CPHA_2Edge; USART_ClockInitStructure.USART_LastBit = USART_LastBit_Disable; USART_ClockInit(USART3, &USART_ClockInitStructure); USART_InitStructure.USART_BaudRate = Bound; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No ; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Tx; /* Configure USART3 basic and asynchronous paramters */ USART_Init(USART3, &USART_InitStructure); /* Enable USART3 */ USART_Cmd(USART3, ENABLE); } /******************************************************************************* * Function Name : NVIC_Configuration * Description : Configures Vector Table base location. * Input : None * Output : None * Return : None *******************************************************************************/ void NVIC_Configuration(void) { NVIC_InitTypeDef NVIC_InitStructure; #ifdef VECT_TAB_RAM /* Set the Vector Table base location at 0x20000000 */ NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0); #else /* VECT_TAB_FLASH */ /* Set the Vector Table base location at 0x08000000 */ NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0); #endif NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); NVIC_SetPriority(SysTick_IRQn,NVIC_EncodePriority(NVIC_GetPriorityGrouping(), 0, 1)); /*ADC转换DMA*/ NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel1_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); /*SDIO中断 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); NVIC_InitStructure.NVIC_IRQChannel = SDIO_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 4; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure);*/ /*按键中断配置 NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 4; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure);*/ } /******************************************************************************************************** ** 函数名称: SendDataByUSART ** 功能描述: 通过USART3发数 ** 输  入: data:数据首地址,num:数据字节数 ** 输  出: 无 ** 返 回: 无 ** 全局变量: 无 ** 调用模块: 无 ********************************************************************************************************/ void SendDataByUSART(u8 *data, u32 num) { int i = 0; for(i = 0; i<num; i++) { USART_SendData(USART3, *data); while( USART_GetFlagStatus(USART3, USART_FLAG_TC) == RESET ); data++; } data -= num; } /******************************************************************************* * Function Name : SysTick_init * Description : Configures the system tick clock. * Input : None * Output : None * Return : None *******************************************************************************/ void SysTick_Configuration(void) { if(SysTick_Config(240000)) /*300hz*/ { while (1); } SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk; } /******************************************************************************* * Function Name : fputc * Description : Retargets the C library printf function to the USART. * Input : None * Output : None * Return : None *******************************************************************************/ int fputc(int ch, FILE *f) { /* Place your implementation of fputc here */ /* e.g. write a character to the USART */ USART_SendData(USART3, (u8) ch); /* Loop until the end of transmission */ while(USART_GetFlagStatus(USART3, USART_FLAG_TC) == RESET) { } return ch; } /******************************************************************************* * Function Name : fgetc * Description : Retargets the C library scanf function to the USART. * Input : None * Output : None * Return : None *******************************************************************************/ int fgetc(FILE *f) { int ch; while((USART3->SR&0x20)==0); ch = USART_ReceiveData(USART3); return ch; } /****************************** (C) COPYRIGHT SmartHealth *****END OF FILE********************************/ [/mw_shl_code]

彼高丽者,边夷贱类,不足待以仁义,不可责以常礼。古来以鱼鳖畜之,宜从阔略。若必欲绝其种类,恐兽穷则搏。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-9-21 00:27:00 | 显示全部楼层
帮顶。。。。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-18 04:37

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表