完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
STM32F3系列的ADC具有高性能与低功耗的特征,本文以STM3F301C8T6为例。
该芯片的ADC具有AHB总线,允许快速数据处理;且ADC接口转换时间与AHB总线频率,独立。说,该系列的ADC可以频率,12位准确在快速通道下可以达到0.19μs的转换时间,慢低速通道也可以达到0.21μs。低精下(如10位)转换时间0.16微秒。有自恢复以及短期时间等其他STM32系列ADC通有的功能。 钟 STM32F301x6 / 8系列具有双时钟域结构,即表示ADC是从AHB总线独立出来的,所以ADC可以由两个单独的时钟源输入: a)ADC 可以是一个特定的频率源,命名为“ADCxy_CK(xy=12或34),与AHB独立且异步。它在RCC中配置,可以提供高达72MHz的频率(PLL输出)。要选择这个方案,ADCx_CCR1:0】必须置0。该选项具有ADC频率可以达到最大的优点,无论选择AHB是。除以一次系数进行分频:1、2、4、6、8、12、16、32 、64、128、256 b)可从ADC总线接口的ADC名称,除以一个44444444444模式下的系数。根据方案。[1:0]这种1、2模式的选择法的除法因素(1、2或4 )选择这个,ADCx_CCR 匹配的CKMODE[1:0]必须与“00”不同该选项具有智能域重同步的优点当ADC由触发和应用程序要求ADC触发且无任何特殊位性时非常特殊。 电压出口 开始ADC操作前需要进行以下操作: 使ADC能内部电压恢复器 启动必须提前或启用ADC之前,软件等待ADC电压调节器的启动时间(TADCVREG_STUB)。 时间必须通过软件实现。在最坏的工艺/温度/电源情况下TADCVREG_STUB等于10μs。 转换时间 开始和转换转换时间是配置的结束时间输入转换数据可能的逐次逼近时间: 外部触发和请求 如果EXTEN[1:转换控制位(规则转换)或JEXTEN[1:0]位(注注转换)“0b00”不同,则外部事件能够触发场合的转换。当软件ADSTART置1,转换有效;当软件将位JADSTART置1,则注入转换选择有效。 注:外部中断线11触发为事件6—EXT6 代码 adc.h #ifndef __ADC_H #define __ADC_H #include 《stm32f30x.h》 #define ADC1_IN3_PORT GPIOA #define ADC1_IN3_PIN GPIO_Pin_2 void Adc_Init(void); #万一 adc.c #include “adc.h” #include “delay.h” void Adc_Init(void) { /*定义结构变量*/ GPIO_InitTypeDef GPIO_InitStructure; ADC_InitTypeDef ADC_InitStructure; ADC_CommonInitTypeDef ADC_CommonInitStructure; /* 使能 ADC1 时钟 */ RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA | RCC_AHBPeriph_ADC12,使能); /* 配置ADC时钟*/ /*配置ADC 时钟为PLL时钟*/ RCC_ADCCLKConfig(RCC_ADC12PLLCLK_Div1); /*配置GPIO为PA2,Pin3模拟输入*/ GPIO_InitStructure.GPIO_Pin = ADC1_IN3_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ; GPIO_Init(ADC1_IN3_PORT,&GPIO_InitStructure); /*默认初始化ADC结构体*/ ADC_StructInit(&ADC_InitStructure); /* 校准程序 */ ADC_VoltageRegulatorCmd(ADC1,使能); delay_us(10); /*ADC_CalibrationMode_Single:选择单通道校准*/ ADC_SelectCalibrationMode(ADC1,ADC_CalibrationMode_Single); ADC_StartCalibration(ADC1); while(ADC_GetCalibrationStatus(ADC1));//等待完成 //ADC_CommonInitTypeDef主要为混合ADC配置,我们只需要配置ADC为独立模式和异步目录目录 ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;//独立模式 ADC_CommonInitStructure.ADC_Clock = ADC_Clock_AsynClkMode; //ADC异步时钟模式 ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled; ADC_CommonInitStructure.ADC_DMAMode = ADC_DMAMode_OneShot; ADC_CommonInitStructure.ADC_TwoSamplingDelay = 0; ADC_CommonInit(ADC1, &ADC_CommonInitStructure); ADC_InitStructure.ADC_ContinuousConvMode = ADC_ContinuousConvMode_Disable;//连续转换失能 ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b; //精确为12位 //外部触发事件6,即EXTI11中断线 ADC_InitStructure.ADC_ExternalTrigConvEvent = ADC_ExternalTrigConvEvent_6; //外部事件上升沿触发,也有下降沿,需要与EXTI ADC_InitStructure.ADC_ExternalTrigEventEdge = ADC_ExternalTrigEventEdge_RisingEdge; ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //数据右卫星 ADC_InitStructure.ADC_OverrunMode = ADC_OverrunMode_Disable; ADC_InitStructure.ADC_AutoInjMode = ADC_AutoInjec_Disable; ADC_InitStructure.ADC_NbrOfRegChannel = 1;//要转换的ADC通道数 ADC_Init(ADC1, &ADC_InitStructure); /* 规则通道参数,设置指定ADC的规则通道,一个序列,采样时间:ADC1通道3,采样时间1.5个周期*/ ADC_RegularChannelConfig(ADC1,ADC_Channel_3,1,ADC_SampleTime_1Cycles5); //使能ADC1 ADC_Cmd(ADC1,使能); /* 等待地址 */ 而(!ADC_GetFlagStatus(ADC1,ADC_FLAG_RDY)); } exti.h #ifndef __EXTI_H #define __EXTI_H #include 《stm32f30x.h》 #define TRIG_PORT GPIOB #define TRIG_PIN GPIO_Pin_11 extern void Exti_Init(void); #万一 exti.c #include “exti.h” void Exti_Init(void) { /* 私有变量---------------------------------------------- -----------*/ EXTI_InitTypeDef EXTI_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; /* 使能 GPIOB 时钟 */ RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB,启用); /* 使能 SYSCFG 时钟 */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG,启用); /* 在输入非拉模式下配置 PB11 引脚 */ GPIO_InitStructure.GPIO_Pin = TRIG_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(TRIG_PORT, &GPIO_InitStructure); /* 将 EXTI11 线连接到 PB11 引脚 */ SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOB,EXTI_PinSource11); /* 配置EXTI11线路*/ EXTI_InitStructure.EXTI_Line = EXTI_Line11; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Event;//配置为事件模式发酵 EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;//上升沿触发触发 EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); } :即使用外部触发,仍需先ADSTART位置1方可开启转换,可使用_Start_Start转换设置将ADC,注意事项如下图所示: 之后写的main.c测试视频,可自己一定时间给GPIOx(X = A 主文件 #include “adc.h” #include “exti.h” #include “delay.h” #include “usart.h” int main(空) { 浮动 ADC1ConvertedValue; 延迟初始化(); Exti_Init(); Adc_Init(); usart_init(); ADC_StartConversion(ADC1);//开启ADC1转换 同时(1) { 而(ADC_GetFlagStatus(ADCx,ADC_FLAG_EOC) == RESET); /*参考电压为3.3V,12位精度为0xFFF*/ ADC1ConvertedValue =ADC_GetConversionValue(ADC1)*3.3/0xFFF; } 返回0; } |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1877 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1661 浏览 1 评论
1145 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
760 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1720 浏览 2 评论
1963浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
789浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
612浏览 3评论
629浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
590浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-1-12 03:02 , Processed in 0.873052 second(s), Total 47, Slave 41 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号