初级会员

- 积分
- 59
- 金钱
- 59
- 注册时间
- 2016-7-20
- 在线时间
- 11 小时
|

楼主 |
发表于 2020-12-7 22:00:28
|
显示全部楼层
#include "adc.h"
#include "delay.h"
#include "dma.h"
DMA_HandleTypeDef hdma_adc1;//¶¨ÒåDMA¾ä±ú
ADC_HandleTypeDef ADC1_Handle;
u16 ADC_ConvertedValue[2];
//DMAxµÄ¸÷ͨµÀÅäÖÃ
//ÕâÀïµÄ´«ÊäÐÎʽÊǹ̶¨µÄ,ÕâµãÒª¸ù¾Ý²»Í¬µÄÇé¿öÀ´ÐÞ¸Ä
//´Ó´æ´¢Æ÷->ÍâÉèģʽ/8λÊý¾Ý¿í¶È/´æ´¢Æ÷ÔöÁ¿Ä£Ê½
//DMA_Streamx MAÊý¾ÝÁ÷,DMA1_Stream0~7/DMA2_Stream0~7
void MYDMA_Config(DMA_Stream_TypeDef *DMA_Streamx)
{
if((u32)DMA_Streamx>(u32)DMA2)//µÃµ½µ±Ç°streamÊÇÊôÓÚDMA2»¹ÊÇDMA1
{
__HAL_RCC_DMA2_CLK_ENABLE();//DMA2ʱÖÓʹÄÜ
}else
{
__HAL_RCC_DMA1_CLK_ENABLE();//DMA1ʱÖÓʹÄÜ
}
if(HAL_DMA_Init(&hdma_adc1) != HAL_OK)
{}
__HAL_LINKDMA(&ADC1_Handle,DMA_Handle,hdma_adc1); //j½«DMAÓëADCÁ¬½ÓÆðÀ´
hdma_adc1.Instance = DMA1_Stream1; /* ʹÓõÄDMA1 Stream1 */
hdma_adc1.Init.Request = DMA_REQUEST_ADC1;/* ÇëÇóÀàÐͲÉÓÃDMA_REQUEST_ADC1 */
hdma_adc1.Init.Direction = DMA_PERIPH_TO_MEMORY; /* ´«Êä·½ÏòÊÇ´Ó´æ´¢Æ÷µ½ÍâÉè */
hdma_adc1.Init.PeriphInc = DMA_PINC_DISABLE; /* ÍâÉèµØÖ·×ÔÔö½ûÖ¹ */
hdma_adc1.Init.MemInc = DMA_MINC_ENABLE; /* ´æ´¢Æ÷µØÖ·×ÔÔöʹÄÜ */
hdma_adc1.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;
hdma_adc1.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;
hdma_adc1.Init.Mode = DMA_CIRCULAR;/* Ñ­»·Ä£Ê½ */
hdma_adc1.Init.Priority = DMA_PRIORITY_LOW; /* ÓÅÏȼ¶µÍ */
hdma_adc1.Init.FIFOMode = DMA_FIFOMODE_DISABLE; /* ½ûÖ¹FIFO*/
if(HAL_DMA_Init(&hdma_adc1) != HAL_OK)
{}
__HAL_LINKDMA(&ADC1_Handle,DMA_Handle,hdma_adc1); //j½«DMAÓëADCÁ¬½ÓÆðÀ´
}
void MY_ADC1_Init(void)
{
ADC_ChannelConfTypeDef ADC_Config;
MYDMA_Config(DMA1_Stream1);
ADC1_Handle.Instance = ADC1;
ADC1_Handle.Init.Resolution = ADC_RESOLUTION_16B; /* 16λ·Ö±æÂÊ */
ADC1_Handle.Init.ScanConvMode = ADC_SCAN_ENABLE; /* ½ûֹɨÃ裬ÒòΪ½ö¿ªÁËÒ»¸öͨµÀ */
ADC1_Handle.Init.EOCSelection = ADC_EOC_SINGLE_CONV; /* EOCת»»½áÊø±êÖ¾ */
ADC1_Handle.Init.LowPowerAutoWait = DISABLE; /* ½ûÖ¹µÍ¹¦ºÄ×Ô¶¯ÑÓ³ÙÌØÐÔ */
ADC1_Handle.Init.ContinuousConvMode = ENABLE; /* ½ûÖ¹×Ô¶¯×ª»»£¬²ÉÓõÄÈí¼þ´¥·¢ */
ADC1_Handle.Init.NbrOfConversion = 2; /* ʹÓÃÁË4¸öת»»Í¨µÀ */
ADC1_Handle.Init.DiscontinuousConvMode = DISABLE; /* ½ûÖ¹²»Á¬Ðøģʽ */
ADC1_Handle.Init.NbrOfDiscConversion = 1; /* ½ûÖ¹²»Á¬Ðøģʽºó£¬´Ë²ÎÊýºöÂÔ£¬´ËλÊÇÓÃÀ´ÅäÖò»Á¬Ðø×Ó×éÖÐͨµÀÊý */
ADC1_Handle.Init.ExternalTrigConv = ADC_SOFTWARE_START; /* ²ÉÓÃÈí¼þ´¥·¢ */
ADC1_Handle.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_RISING; /* ²ÉÓÃÈí¼þ´¥·¢µÄ»°£¬´ËλºöÂÔ */
ADC1_Handle.Init.ConversionDataManagement = ADC_CONVERSIONDATA_DMA_CIRCULAR; /* DMAÑ­»·Ä£Ê½½ÓÊÕADCת»»µÄÊý¾Ý */
ADC1_Handle.Init.BoostMode = ENABLE; /* ADCʱÖÓµÍÓÚ20MHzµÄ»°£¬¿ÉÒÔ½ûÖ¹boost */
ADC1_Handle.Init.Overrun = ADC_OVR_DATA_OVERWRITTEN; /* ADCת»»Òç³öµÄ»°£¬¸²¸ÇADCµÄÊý¾Ý¼Ä´æÆ÷ */
ADC1_Handle.Init.OversamplingMode = DISABLE; /* ½ûÖ¹¹ý²ÉÑù */
HAL_ADC_Init(&ADC1_Handle); //??? ADC1
/*PA6¶Ë¿ÚµÄADC*/
HAL_ADCEx_Calibration_Start(&ADC1_Handle,ADC_CALIB_OFFSET,ADC_SINGLE_ENDED); //ADCУ׼
ADC_Config.Channel = ADC_CHANNEL_3; /* ÅäÖÃʹÓõÄADCͨµÀ */
ADC_Config.Rank = ADC_REGULAR_RANK_1; /* ²ÉÑùÐòÁÐÀïµÄµÚ1¸ö */
ADC_Config.SamplingTime = ADC_SAMPLETIME_64CYCLES_5; /* ²ÉÑùÖÜÆÚ */
ADC_Config.SingleDiff = ADC_SINGLE_ENDED ; /* µ¥¶ËÊäÈë */
ADC_Config.Offset=0; /* ÎÞÆ«ÒƵÄÇé¿öÏ£¬´Ë²ÎÊýºöÂÔ */
ADC_Config.OffsetRightShift = DISABLE; /* ½ûÖ¹ÓÒÒÆ */
ADC_Config.OffsetSignedSaturation = DISABLE; /* ½ûÖ¹ÓзûºÅ±¥ºÍ */
HAL_ADC_ConfigChannel(&ADC1_Handle, &ADC_Config); /*ʹÄÜADC */
/*PA4¶Ë¿ÚµÄADC*/
ADC_Config.Channel = ADC_CHANNEL_7; /* ÅäÖÃʹÓõÄADCͨµÀ */
ADC_Config.Rank = ADC_REGULAR_RANK_2; /* ²ÉÑùÐòÁÐÀïµÄµÚ1¸ö */
ADC_Config.SamplingTime = ADC_SAMPLETIME_64CYCLES_5; /* ²ÉÑùÖÜÆÚ */
ADC_Config.SingleDiff = ADC_SINGLE_ENDED ; /* µ¥¶ËÊäÈë */
ADC_Config.Offset=0; /* ÎÞÆ«ÒƵÄÇé¿öÏ£¬´Ë²ÎÊýºöÂÔ */
ADC_Config.OffsetRightShift = DISABLE; /* ½ûÖ¹ÓÒÒÆ */
ADC_Config.OffsetSignedSaturation = DISABLE; /* ½ûÖ¹ÓзûºÅ±¥ºÍ */
HAL_ADC_ConfigChannel(&ADC1_Handle, &ADC_Config); /*ʹÄÜADC */
ADC_Enable(&ADC1_Handle);
HAL_ADC_Start_DMA(&ADC1_Handle, (uint32_t *)ADC_ConvertedValue, 2);
}
//ADCµ×²ãÇý¶¯£¬Òý½ÅÅäÖã¬Ê±ÖÓʹÄÜ
//´Ëº¯Êý»á±»HAL_ADC_Init()µ÷ÓÃ
//hadc:ADC¾ä±ú
void HAL_ADC_MspInit(ADC_HandleTypeDef* hadc)
{
GPIO_InitTypeDef GPIO_Initure;
__HAL_RCC_ADC12_CLK_ENABLE(); //¿ªÆôADC12ʱÖÓ
__HAL_RCC_GPIOA_CLK_ENABLE(); //¿ªÆôGPIOAʱÖÓ
__HAL_RCC_ADC_CONFIG(RCC_ADCCLKSOURCE_CLKP); //ADCÍâÉèʱÖÓÑ¡Ôñ
GPIO_Initure.Pin=GPIO_PIN_6|GPIO_PIN_7; //PA6,PA4,PA7
GPIO_Initure.Mode=GPIO_MODE_ANALOG; //????
GPIO_Initure.Pull=GPIO_NOPULL; //????
GPIO_Initure.Speed=GPIO_SPEED_FREQ_VERY_HIGH; //??
HAL_GPIO_Init(GPIOA,&GPIO_Initure);
HAL_ADCEx_Calibration_Start(&ADC1_Handle,ADC_CALIB_OFFSET,ADC_SINGLE_ENDED); //ADC ??
HAL_NVIC_EnableIRQ( ADC_IRQn ); //??ADC_IRQn????
HAL_NVIC_SetPriority( ADC_IRQn ,0,0); //?????0,????0
}
void my_GetAdcValues(void)
{
float AdcValues[2];
/*
ʹÓô˺¯ÊýÒªÌرð×¢Ò⣬µÚ1¸ö²ÎÊýµØÖ·Òª32×Ö½Ú¶ÔÆ룬µÚ2¸ö²ÎÊýÒªÊÇ32×Ö½ÚµÄÕûÊý±¶
*/
SCB_InvalidateDCache_by_Addr((uint32_t *)ADC_ConvertedValue, sizeof(ADC_ConvertedValue));
AdcValues[0] =ADC_ConvertedValue[0] * 3.3 / 65536;
AdcValues[1] = ADC_ConvertedValue[1] * 3.3 / 65536;
printf("AdcValues[0] = %5.3fV, AdcValues[0] = %5.3fV\r\n", AdcValues[0], AdcValues[1]);
}
|
|