12位ADC是一种逐次迫临型模仿数字数字转化器。它有多达18个通道,可测量16个外部和2个内部信号源。ADC的输入时钟不得超越14MHZ,它是由PCLK2经分频发生。假如被ADC转化的模仿电压低于低阀值或高于高阀值,AWD模仿看门狗状况位被设置。
ADC一般要与DMA一同运用 这儿仅仅简略的用库装备ADC 不断扫描来完结ADC的运用。
装备DMA:
void DMA_Config(void) { DMA_InitTypeDef DMA_InitStructure;//界说DMA初始化结构体 DMA_DeInit(DMA_Channel1);//复位DMA通道1 DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address; //界说 DMA通道外设基地址=ADC1_DR_Address DMA_InitStructure.DMA_MemoryBaseAddr = (u32)ADC_ConvertedValue; //界说DMA通道存储器地址 DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;//指定外设为源地址 DMA_InitStructure.DMA_BufferSize = 1;//界说DMA缓冲区巨细1 DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//当时外设寄存器地址不变 DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable;//当时存储器地址不变 DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;//界说外设数据宽度16位 DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; //界说存储器数据宽度16位 DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;//DMA通道操作形式位环形缓冲形式 DMA_InitStructure.DMA_Priority = DMA_Priority_High;//DMA通道优先级高 DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;//制止DMA通道存储器到存储器传输 DMA_Init(DMA_Channel1, DMA_InitStructure);//初始化DMA通道1 DMA_Cmd(DMA_Channel1, ENABLE); //使能DMA通道1 }
装备ADC的运转:
void ADC_Config(void) { ADC_InitTypeDef ADC_InitStructure;//界说ADC初始化结构体变量 ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;//ADC1和ADC2作业在独立形式 ADC_InitStructure.ADC_ScanConvMode = ENABLE; //使能扫描 ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;//ADC转化作业在接连形式 ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//有软件操控转化 ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//转化数据右对齐 ADC_InitStructure.ADC_NbrOfChannel = 1;//转化通道为通道1 ADC_Init(ADC1, ADC_InitStructure); //初始化ADC ADC_RegularChannelConfig(ADC1, ADC_Channel_14, 1, ADC_SampleTime_28Cycles5); //ADC1挑选信道14,音序器等级1,采样时刻239.5个周期 ADC_DMACmd(ADC1, ENABLE);//使能ADC1模块DMA ADC_Cmd(ADC1, ENABLE);//使能ADC1 ADC_ResetCalibration(ADC1); //重置ADC1校准寄存器 while(ADC_GetResetCalibrationStatus(ADC1));//等候ADC1校准重置完结 ADC_StartCalibration(ADC1);//开端ADC1校准 while(ADC_GetCalibrationStatus(ADC1));//等候ADC1校准完结 ADC_SoftwareStartConvCmd(ADC1, ENABLE); //使能ADC1软件开端转化 }
(1) 第一个参数是ADC_Mode,这儿设置为独立形式:
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
在这个形式下,双ADC不能同步,每个ADC接口独立作业。所以假如不需求ADC同步或许仅仅用了一个ADC的时分,就应该设成独立形式了。
(2) 第二个参数是ADC_ScanConvMode,这儿设置为DISABLE。
ADC_InitStructure.ADC_ScanConvMode = DISABLE;
假如仅仅用了一个通道的话,DISABLE就能够了,假如运用了多个通道的话,则有必要将其设置为ENABLE。
(3) 第三个参数是ADC_ContinuousConvMode,这儿设置为ENABLE,即接连转化。假如设置为DISABLE,则是单次转化。两者的差异在于接连转化直到一切的数据转化完结后才中止转化,而单次转化则只转化一次数据就中止,要再次触发转化才能够。所以假如需求一次性收集1024个数据或许更多,则选用接连转化。
(4) 第四个参数是ADC_ExternalTrigConv,即挑选外部触发形式。这儿只讲三种:
1、第一种是最简略的软件触发,参数为ADC_ExternalTrigConv_None。设置好后还要记住调用库函数:
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
这样触发才会发动。
2、第二种是定时器通道输出触发。共有这几种:ADC_ExternalTrigConv_T1_CC1、ADC_ExternalTrigConv_T1_CC2、ADC_ExternalTrigConv_T2_CC2、
ADC_ExternalTrigConv_T3_T以及ADC_ExternalTrigConv_T4_CC4。定时器输出触发比较费事,还需求设置相应的定时器。以
ADC_ExternalTrigConv_T2_CC2触发为例设置相应的定时器:
void TIM2_Configuration(void){ TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; TIM_TimeBaseStructure.TIM_Prescaler = 4; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseStructure.TIM_Period = 0XFF; TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_RepetitionCounter = 0; TIM_TimeBaseInit(TIM2, TIM_TimeBaseStructure); TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = 0X7F; TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set; TIM_OC2Init(TIM2, TIM_OCInitStructure); TIM_Cmd(TIM2, ENABLE); TIM_CtrlPWMOutputs(TIM2, ENABLE); }
这样设置之后就能够用定时器2的输出触发了,至于触发的周期,设置TIM2的时刻即可。这儿不再赘述。
3、第三种是外部引脚触发,关于规矩通道,挑选EXTI线11和TIM8_TRGO作为外部触发事情;而注入通道组则挑选EXTI线15和TIM8_CC4作为外部触发事情。
(5) 第五个参数是ADC_DataAlign,这儿设置为ADC_DataAlign_Right右对齐方法。主张选用右对齐方法,由于这样处理数据会比较便利。当然假如要从高位开端传输数据,那么选用左对齐优势就显着了。
(6) 第六个参数是ADC_NbrOfChannel,望文生义:通道的数量。要是到多个通道收集数据的话就得设置一下这个参数。此外在规矩通道组的装备函数中或许将各个通道的次序界说一下,如:
ADC_RegularChannelConfig(ADC1,ADC_Channel_13,1,ADC_SampleTime_13Cycles5); ADC_RegularChannelConfig(ADC1,ADC_Channel_14,2,ADC_SampleTime_13Cycles5);
多通道数据传输时有一点还要留意:若一个数组为ADC_ValueTab[4],且设置了两个通道:通道1和通道2,则转化完毕后,ADC_ValueTab[0]和ADC_ValueTab[2]存储的是通道1的数据,而ADC_ValueTab[1]和ADC_ValueTab[3]存储的是通道2的数据。假如数组容量大则顺次类推。
弥补一点:在运用DMA传输数据的时分,需求设置外设地址和存储器地址,外设地址当然便是ADC的地址了,而存储器的地址假如运用8位数据的话,存储器有必要界说为8位缓冲区;假如运用16位数据格式的话,存储器则为16位缓冲器,不行界说为32位或更多,不然,数据将犯错。
- STM32单片机中文官网
- STM32单片机官方开发工具
- STM32单片机参阅规划