完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
void adcinit(void)
{ GPIO_InitTypeDef GPIO_InitStruct; ADC_InitTypeDef ADC_InitStruct; RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE); RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA,ENABLE); GPIO_InitStruct.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_4 | GPIO_Pin_5; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AN; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOA, GPIO_InitStruct); ADC_InitStruct.ADC_Resolution = ADC_Resolution_12b; ADC_InitStruct.ADC_ContinuousConvMode = DISABLE; ADC_InitStruct.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None; ADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Right; ADC_InitStruct.ADC_ScanDirection = ADC_ScanDirection_Upward; ADC_Init(ADC1, ADC_InitStruct); ADC_ChannelConfig(ADC1,ADC_Channel_0,ADC_SampleTime_55_5Cycles); ADC_ChannelConfig(ADC1,ADC_Channel_1,ADC_SampleTime_55_5Cycles); ADC_ChannelConfig(ADC1,ADC_Channel_2,ADC_SampleTime_55_5Cycles); ADC_GetCalibrationFactor(ADC1); ADC_Cmd(ADC1,ENABLE); } /************************************************************** * Function Name : getadcvalue * Param : void * Return Param : void * Description : 获取adc转换结果 ***************************************************************/ void getadcvalue(void) { UINT32 idx; while(ADC_GetFlagStatus(ADC1,ADC_FLAG_ADRDY) == DISABLE); ADC_StartOfConversion(ADC1); for(idx = 0;idx < 3;idx++) { // while(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC) == DISABLE); ADC1ConvValue[idx] = ADC_GetConversionValue(ADC1); } if(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOSEQ) == ENABLE) { ADC_ClearFlag(ADC1,ADC_FLAG_EOSEQ); } } 用上面的代码可以实现序列通道单次转换吗? 目的:调用一次getadcvalue() 就采集一次数据 求大神指点,while(EOC)不注释掉的话,好像只能调用一次,手册上写,EOC不是读取数据后才会清零吗? |
|
相关推荐
1个回答
|
|
为了实现在STM32F030上使用ADC转换,并在调用一次`getadcvalue()`函数时采集一次数据,您需要完成以下步骤:
1. 初始化ADC和GPIO。 2. 配置ADC通道。 3. 启动ADC转换。 4. 读取ADC转换结果。 以下是详细的步骤和代码示例: 步骤1:初始化ADC和GPIO ```c void adcinit(void) { GPIO_InitTypeDef GPIO_InitStruct; ADC_InitTypeDef ADC_InitStruct; RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); // 使能ADC1时钟 RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE); // 使能GPIOA时钟 // 配置PA1为模拟输入 GPIO_InitStruct.GPIO_Pin = GPIO_Pin_1; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AN; GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOA, &GPIO_InitStruct); // 初始化ADC ADC_InitStruct.ADC_Resolution = ADC_Resolution_12b; // 12位分辨率 ADC_InitStruct.ADC_ScanConvMode = DISABLE; // 单通道模式 ADC_InitStruct.ADC_ContinuousConvMode = ENABLE; // 连续转换模式 ADC_Init(ADC1, &ADC_InitStruct); // 配置ADC通道 ADC_ChannelConfig(ADC1, ADC_Channel_1, ADC_SampleTime_3Cycles); // 选择PA1作为ADC通道 // 使能ADC ADC_Cmd(ADC1, ENABLE); // 启动ADC校准 ADC_StartCalibration(ADC1); while (ADC_GetCalibrationStatus(ADC1) == RESET) { // 等待校准完成 } // 使能ADC DMA请求 ADC_DMACmd(ADC1, ENABLE); } ``` 步骤2:配置ADC通道(已在步骤1中完成) 步骤3:启动ADC转换(已在步骤1中使能ADC) 步骤4:实现`getadcvalue()`函数,读取ADC转换结果 ```c uint16_t getadcvalue(void) { __HAL_ADC_ENABLE(&hadc1); // 使能ADC HAL_ADC_Start(&hadc1); // 启动ADC转换 while (__HAL_ADC_GET_STATE(&hadc1) != HAL_ADC_STATE_EOC) { // 等待转换完成 } return HAL_ADC_GetValue(&hadc1); // 返回转换结果 } ``` 在您的主函数中,调用`adcinit()`进行初始化,然后通过调用`getadcvalue()`函数来获取ADC转换结果。 ```c int main(void) { adcinit(); // 初始化ADC while (1) { uint16_t adc_value = getadcvalue(); // 获取ADC转换结果 // 根据需要处理adc_value } } ``` 这样,每次调用`getadcvalue()`函数时,都会采集一次ADC数据。 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1683 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1582 浏览 1 评论
1013 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
703 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1627 浏览 2 评论
1892浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
675浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
538浏览 3评论
558浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
526浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-4 02:34 , Processed in 0.875147 second(s), Total 81, Slave 63 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号