新手上路
- 积分
- 28
- 金钱
- 28
- 注册时间
- 2020-10-26
- 在线时间
- 15 小时
|
5金钱
#include "bsp_adc.h"
//双ADC采一个通道,提高采样速率 快速交叉模式
//ADC时钟为14M,正常最多只能达到12M,本实验测试了12M与18M
//Tcon=采样时间+12.5周期 设置采样时间最短为1.5周期
uint32_t ADC_DATA=0;
static void ADC_GPIO_Configure(void)
{
GPIO_InitTypeDef GPIO_Structure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
GPIO_Structure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Structure.GPIO_Pin = GPIO_Pin_1;
GPIO_Init(GPIOC, &GPIO_Structure);
}
void ADC_Init_Configure(void)
{
ADC_InitTypeDef ADC_Structure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1|RCC_APB2Periph_ADC2,ENABLE);
/*--------------------------ADC1---------------------------------------*/
ADC_Structure.ADC_Mode = ADC_Mode_FastInterl;
ADC_Structure.ADC_ScanConvMode = DISABLE;
ADC_Structure.ADC_ContinuousConvMode = ENABLE;
ADC_Structure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
ADC_Structure.ADC_DataAlign = ADC_DataAlign_Right;
ADC_Structure.ADC_NbrOfChannel = 1;
ADC_Init(ADC1, &ADC_Structure);
RCC_ADCCLKConfig(RCC_PCLK2_Div6);
ADC_RegularChannelConfig(ADC1,ADC_Channel_11, 1,ADC_SampleTime_1Cycles5);
ADC_DMACmd(ADC1, ENABLE);
/*--------------------------ADC2-------------------------------------------*/
ADC_Structure.ADC_Mode = ADC_Mode_FastInterl;
ADC_Structure.ADC_ScanConvMode = DISABLE;
ADC_Structure.ADC_ContinuousConvMode = ENABLE;
ADC_Structure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
ADC_Structure.ADC_DataAlign = ADC_DataAlign_Right;
ADC_Structure.ADC_NbrOfChannel = 1;
ADC_Init(ADC2, &ADC_Structure);
RCC_ADCCLKConfig(RCC_PCLK2_Div6);
ADC_RegularChannelConfig(ADC2,ADC_Channel_11, 1,ADC_SampleTime_1Cycles5);
ADC_ExternalTrigConvCmd(ADC2,ENABLE);
/*------------------ADC1校准----------------------*/
ADC_Cmd(ADC1, ENABLE);
ADC_ResetCalibration(ADC1);
while(ADC_GetResetCalibrationStatus(ADC1));
ADC_StartCalibration(ADC1);
while(ADC_GetCalibrationStatus(ADC1));
/*------------------ADC2校准-----------------------*/
ADC_Cmd(ADC2, ENABLE);
ADC_ResetCalibration(ADC2);
while(ADC_GetResetCalibrationStatus(ADC2));
ADC_StartCalibration(ADC2);
while(ADC_GetCalibrationStatus(ADC2));
//ADC1软件触发
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
}
void ADC1_DMA_Init(void)
{
DMA_InitTypeDef DMA_Structure;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
DMA_DeInit(DMA1_Channel1);
DMA_Structure.DMA_PeripheralBaseAddr = (uint32_t)(&(ADC1->DR));
DMA_Structure.DMA_MemoryBaseAddr = (uint32_t)&ADC_DATA;
DMA_Structure.DMA_DIR = DMA_DIR_PeripheralSRC;
DMA_Structure.DMA_BufferSize = 8;
DMA_Structure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_Structure.DMA_MemoryInc = DMA_MemoryInc_Enable;
DMA_Structure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;
DMA_Structure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word;
DMA_Structure.DMA_Mode = DMA_Mode_Circular;
DMA_Structure.DMA_Priority = DMA_Priority_High;
DMA_Structure.DMA_M2M = DMA_M2M_Disable;
DMA_Init(DMA1_Channel1, &DMA_Structure);
DMA_Cmd(DMA1_Channel1, ENABLE);
}
void ADC_InitS(void)
{
ADC_GPIO_Configure();
ADC1_DMA_Init();
ADC_Init_Configure();
}
//main函数
#include "bsp_adc.h"
#include "stm32f10x.h"
#include "bsp_usart.h"
extern uint32_t ADC_DATA;
int main(void)
{
uint16_t ADC1_DATA;
uint16_t ADC2_DATA;
double a,b;
uint8_t i=0;
USART1_Config();
ADC_InitS();
while(1)
{
ADC2_DATA = (uint16_t)((ADC_DATA>>16)&0xfff);
ADC1_DATA = (uint16_t)((ADC_DATA)&0xfff);
a = (double)(ADC2_DATA/4096*3.3);
b = (double)ADC1_DATA/4096*3.3;
printf("%f\r",a);
printf("%f\r",b);
}
}
|
|