金牌会员
 
- 积分
- 1684
- 金钱
- 1684
- 注册时间
- 2014-2-25
- 在线时间
- 230 小时
|
发表于 2016-1-18 12:28:21
|
显示全部楼层
u16 ADC_Converted_Buff[4]; //ADC数据缓存
//ADC_Converted_Buff[0] 电池电压(电压小于3.5V=ADC_Converted_Buff[0]=2172)
//ADC_Converted_Buff[1] 油门方向
//ADC_Converted_Buff[2] 前后方向
//ADC_Converted_Buff[3] 左右方向
//初始化ADC
void ADC1_Init(void)
{
ADC_InitTypeDef ADC_InitStructure;
DMA_InitTypeDef DMA_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
//开启时钟
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); //使能DMA传输
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_ADC1,ENABLE);
ADC_DeInit(ADC1); //复位ADC1
RCC_ADCCLKConfig(RCC_PCLK2_Div6); //设置ADC时钟,72/6=12MHz
//GPIOA作为模拟通道输入引脚
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;//模拟输入
GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化GPIOA
//ADC参数初始化
ADC_InitStructure.ADC_Mode=ADC_Mode_Independent;//ADC独立模式
ADC_InitStructure.ADC_ScanConvMode=ENABLE; //多通道模式
ADC_InitStructure.ADC_ContinuousConvMode=ENABLE;//连续转换模式
ADC_InitStructure.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None;//转换由软件触发而不受外部触发
ADC_InitStructure.ADC_DataAlign=ADC_DataAlign_Right;//ADC数据右对齐
ADC_InitStructure.ADC_NbrOfChannel=4; //顺序进行规则转换的ADC通道数目4
ADC_Init(ADC1,&ADC_InitStructure); //初始化ADC1
ADC_Cmd(ADC1,ENABLE); //使能ADC1
//DMA初始化
DMA_DeInit(DMA1_Channel1); //将DMA的通道x寄存器重设为缺省值
DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&ADC1->DR; //DMA外设基地址
DMA_InitStructure.DMA_MemoryBaseAddr = (u32)ADC_Converted_Buff;//DMA内存基地址
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; //数据传输方向,从内存读取
DMA_InitStructure.DMA_BufferSize = 4; //DMA通道的DMA缓存的大小
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //外设地址寄存器不变
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //内存地址寄存器递增
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; //数据宽度为16位
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; //数据宽度为16位
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; //工作在循环缓存模式
DMA_InitStructure.DMA_Priority = DMA_Priority_High; //DMA通道 x拥有高优先级
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; //DMA通道x没有设置为内存到内存传输
DMA_Init(DMA1_Channel1, &DMA_InitStructure); //根据DMA_InitStruct中指定的参数初始化DMA的通道USART1_Tx_DMA_Channel所标识的寄存器
DMA_Cmd(DMA1_Channel1,ENABLE); //打开DMA传输
ADC_ResetCalibration(ADC1); //开启复位校准
while(ADC_GetResetCalibrationStatus(ADC1));//等待复位校准结束
ADC_StartCalibration(ADC1); //开启AD校准
while(ADC_GetCalibrationStatus(ADC1));//等待校准结束
//通道1电池电压检测,转换顺序1
ADC_RegularChannelConfig(ADC1,ADC_Channel_1,1,ADC_SampleTime_71Cycles5);
//通道0油门检测,转换顺序2
ADC_RegularChannelConfig(ADC1,ADC_Channel_0,2,ADC_SampleTime_71Cycles5);
//通道2遥感方向A检测,转换顺序3
ADC_RegularChannelConfig(ADC1,ADC_Channel_2,3,ADC_SampleTime_71Cycles5);
//通道9遥感方向B检测,转换顺序4
ADC_RegularChannelConfig(ADC1,ADC_Channel_9,4,ADC_SampleTime_71Cycles5);
ADC_DMACmd(ADC1, ENABLE); //ADC1 DMA传送数据打开
ADC_SoftwareStartConvCmd(ADC1,ENABLE); //使能指定的ADC1的软件转换功能
}
|
|