完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
在做STM32L151 多路AD采集时。
AD的初始化: void ADC_Config(void) { /* Enable The HSI (16Mhz) */ RCC_HSICmd(ENABLE); /* Check that HSI oscillator is ready */ while(RCC_GetFlagStatus(RCC_FLAG_HSIRDY) == RESET); /* Configure RV3 input voltage */ /* Enable the GPIOF Clock */ RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE); /* Configure PF.11 (ADC channel 1b) or PA.05 (ADC channel 5) in analog mode */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_7; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOA, GPIO_InitStructure); /* ADC1 Configuration ------------------------------------------------------*/ RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); /* ADC1 DeInit */ ADC_DeInit(ADC1); #ifdef USE_STM32L152D_EVAL /* Select ADC Bank channel */ ADC_BankSelection(ADC1, ADC_Bank_B); #endif /* ADC1 Configuration of channel18/31 and channel5/1b : continuous mode, external trigger (TIM2) */ ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b; ADC_InitStructure.ADC_ScanConvMode = ENABLE; ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_Falling; ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T2_TRGO; ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; ADC_InitStructure.ADC_NbrOfConversion = 2; ADC_Init(ADC1, ADC_InitStructure); /* ADC1 Regular Channel Config */ ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_192Cycles); ADC_RegularChannelConfig(ADC1, ADC_Channel_7, 2, ADC_SampleTime_192Cycles); /* Enables the ADC1 Power Down during Delay */ ADC_PowerDownCmd(ADC1, ADC_PowerDown_Idle_Delay, ENABLE); /* Delay until the converted data has been read */ ADC_DelaySelectionConfig(ADC1, ADC_DelayLength_Freeze); /* Enable ADC1 */ ADC_Cmd(ADC1, ENABLE); /* Wait until the ADC1 is ready */ while(ADC_GetFlagStatus(ADC1, ADC_FLAG_ADONS) == RESET) { } } T2的初始化: void TIM2_Config(void) { /* Enable TIM2 clock */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); TIM_DeInit(TIM2); TIM_TimeBaseStructInit( TIM_TimeBaseStructure); /* Time base configuration */ TIM_TimeBaseStructure.TIM_Period = 0xFF; TIM_TimeBaseStructure.TIM_Prescaler = 0x1; TIM_TimeBaseStructure.TIM_ClockDivision = 0x0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM2, TIM_TimeBaseStructure); /* TIM2 TRGO selection */ TIM_SelectOutputTrigger(TIM2, TIM_TRGOSource_Update); /* Enable TIM2 Update Interrupt*/ TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init( NVIC_InitStructure); /* Enable TIM2 */ TIM_Cmd(TIM2,ENABLE); } 中断获取数据: void TIM2_IRQHandler(void) { if(TIM_GetITStatus(TIM2, TIM_IT_Update) == SET) { iddtmp = ADC_GetConversionValue(ADC1); rv3voltagetmp = ADC_GetConversionValue(ADC1); /* Clear the TIM2 Update flag */ TIM_ClearITPendingBit(TIM2, TIM_IT_Update); } } 程序运行后发现iddtmp 和rv3voltagetmp 值是一样的。 发现使用下面的时钟初始化就没有问题:(使用了内部时钟MSI) 使用多路AD采集时,使用内部时钟MSI正常,使用外部时钟HSE时,2路AD采集值一直相同。 |
|
相关推荐
1个回答
|
|
Io_Pin_11;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN; GPIO_Init(GPIOF, &GPIO_InitStructure); /* Enable the ADC1 Clock */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); /* ADC1 configuration */ ADC_DeInit(ADC1); ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b; 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_InitStructure.ADC_NbrOfChannel = 2; ADC_Init(ADC1, &ADC_InitStructure); /* ADC1 regular channels configuration */ ADC_RegularChannelConfig(ADC1, ADC_Channel_5, 1, ADC_SampleTime_3Cycles); ADC_RegularChannelConfig(ADC1, ADC_Channel_11, 2, ADC_SampleTime_3Cycles); /* Enable ADC1 */ ADC_Cmd(ADC1, ENABLE); /* Wait for the ADC to stabilize */ while (ADC_GetFlagStatus(ADC1, ADC_FLAG_RDY) == RESET); /* Start ADC1 Software Trigger */ ADC_SoftwareStartConvCmd(ADC1, ENABLE); /* Wait until the end of conversion */ while (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET); /* Read the converted value of regular channel data */ uint16_t ADC_Value1 = ADC_GetConversionValue(ADC1); /* Start ADC1 Software Trigger */ ADC_SoftwareStartConvCmd(ADC1, ENABLE); /* Wait until the end of conversion */ while (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET); /* Read the converted value of regular channel data */ uint16_t ADC_Value2 = ADC_GetConversionValue(ADC1); /* ... */ return; } 这段代码是用于STM32L151的多路AD采集的初始化和配置。下面是对代码的逐行解释: 1. 启用HSI(16MHz)时钟源。 2. 等待HSI振荡器准备就绪。 3. 启用GPIOF时钟。 4. 将PF.11(ADC通道11)和PA.05(ADC通道5)配置为模拟模式。 5. 启用ADC1时钟。 6. 对ADC1进行去初始化。 7. 配置ADC1的分辨率、扫描转换模式、连续转换模式、外部触发转换、数据对齐和通道数量。 8. 使用配置结构初始化ADC1。 9. 配置ADC1的常规通道,包括通道5和通道11,以及采样时间。 10. 启用ADC1。 11. 等待ADC1稳定。 12. 启动ADC1软件触发。 13. 等待转换结束。 14. 读取ADC1的转换值。 15. 重复步骤12-14以获取更多通道的转换值。 这段代码应该可以帮助您实现STM32L151的多路AD采集。如果您有任何疑问或需要进一步的帮助,请随时提问。 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1777 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1621 浏览 1 评论
1080 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
728 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1678 浏览 2 评论
1938浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
731浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
570浏览 3评论
595浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
554浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-23 11:05 , Processed in 0.809437 second(s), Total 49, Slave 43 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号