完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
MM32F3270系列的ADC支持注入通道功能,每个ADC模块具有4个注入通道。每个注入通道具有独立的数据寄存器,注入通道具有比规则通道更高的优先级。 规则通道是按照指定的通道顺序进行转换。注入通道是指在规则通道转换过程中,如果突然需要进行其他某个通道的采样,则会在规则通道该次转换完成后停止转换,进行注入通道转换直到转换结束,再继续规则通道转换。 在一些特定场合使用ADC时可能会遇到很多情况,不仅仅简单的按规则通道来采样,有时候需要立刻采样,这就要用到注入通道。 注入通道模式介绍 注入通道工作模式分为自动注入和事件注入两种模式: a) 自动注入:任意通道工作完成后自动开始注入通道工作; b) 事件注入:注入事件到来, A/D转换完成当前转换后开始注入通道转换,完成注入通道转换后继续执行任意通道转换。 自动注入转换模式 任意通道配置通道转换完成后,自动开始注入通道转换。如果任意通道是连续扫描模式,需要清除ADST才能停止转换。配置自动注入转换模式应禁止注入事件发生。 自动注入模式-通道转换时序图 事件注入工作模式 注入事件下禁止自动注入模式。注入事件发生后(包括软件和触发),如果当前转换正在进行,则完成当前转换后开始注入通道转换。 任意通道转换时注入事件转换通道时序图 在注入通道转换期间有任意通道事件产生,注入转换不会结束,但会保存任意通道事件。完成本次转换序列后,开始任意通道事件的转换。 注入通道转换时任意事件转换通道发生时序图 使用触发开始注入通道转换,必须保证触发事件的间隔长与注入序列,注入通道转换期间发生注入事件将被忽略。 触发信号 DC转换的触发源包括软件触发、定时器和外部事件。 在触发信号产生后,延时N个PCLK2的时钟周期再开始采样。如果是触发扫描模式,只有第一个通道采样被延时,其余通道是在上一个采样结束后立即开始。 设置ADC_ANY_CR寄存器的JTRGEN位可以使用外部事件触发注入通道转换。设置ADC_ANY_CR寄存器的JTRGSEL位可以选择注入通道外部触发源。 具体的外部触发源选择情况,可以参考AD控制寄存器(ADC_ADCR.TRGSEL 或ADC_ANY_CR.JTRGSEL)相关位的描述。外部触发可设置延时控制,具体参考AD控制寄存器(ADC_ADCR.TRGSHIFT 或 ADC_ANY_CR.J TRGSHIFT)相关位的描述。 实验 本次实验使用ADC的注入通道:将ADC1的通道0配置为规则通道模式,通过软件触发,并使用DMA传输数据。将ADC1的通道1配置为注入通道模式,通过外部事件触发,并使用中断,在中断服务子程序中,就可以获取AD值。 开始只有ADC1的通道0进行AD转换,通道1不进行AD转换。当外部事件发生后,通道0当前转换结束后停止,通道1开始进行转换直至结束,通道0继续进行AD转换,经MCU处理将电压数据打印出来。 程序设计 ADC1 配置初始化 void ADC1BasicConfigWithParameter(void) { ADC_InitTypeDef ADC_InitStruct; ADC_TypeDef* ADCn; ADCn = ADC1; ADC_Structinit(&ADC_InitStruct); ADCxClockSet(ADCn, ENABLE); ADC_InitStruct.ADC_Resolution = ADC_Resolution_12b; ADC_InitStruct.ADC_PRESCARE = ADC_PCLK2_PRESCARE_16; ADC_InitStruct.ADC_Mode = ADC_Mode_Continue; ADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Right; ADC_InitStruct.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1; ADC_Init(ADCn, &ADC_InitStruct); ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 0, ADC_SMPR1_SAMCTL0_240_5); ADC_InjectedSequencerConfig(ADC1, ADC_ANY_CR_JTRGSEL_EXTI12, ADC_ANY_CR_JTRGSHIFT_64); ADC_InjectedSequencerLengthConfig(ADC1, ADC_Inject_Seqen_Len1); ADC_InjectedSequencerChannelConfig(ADC1, ADC_InjectedChannel_1, ADC_Channel_1); ADC1->ANYCR |= (1<<4); DMAInit(); ADC_DMACmd(ADCn, ENABLE); ADC_Cmd(ADCn, ENABLE); } 外部事件初始化 ADC触发源选择外部事件触发方式,配置EXTI_Line12下降沿触发外部中断,通过PB12复用为外部中断/事件线。void EXTIX_Init(void) { EXTI_InitTypeDef EXTI_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2ENR_SYSCFG, ENABLE); //Set to pull-up input RCC_AHBPeriphClockCmd(RCC_AHBENR_GPIOB, ENABLE); GPIO_StructInit(&GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_Init(GPIOB, &GPIO_InitStructure); //GPIOB.12 SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOB, EXTI_PinSource12); EXTI_StructInit(&EXTI_InitStructure); EXTI_InitStructure.EXTI_Line = EXTI_Line12; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Event; //Falling edge trigger EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); } ADC1中断服务函数 外部事件触发ADC注入通道采样,转换完成便会触发ADC中断,在中断服务子程序中获取AD值。void ADC1_2_IRQHandler(void) { if(RESET != ADC_SREXT_JEOSIF) { ADC1->SREXT |= (1 << 20); //Clear the bit by writing about 1 ADCVAL = ADC_GetInjectedCurrentConvertedValue(ADC1); Flag_InjectConvert = 1; if(RESET != EXTI_GetFlagStatus(EXTI_Line12)) { EXTI_ClearITPendingBit(EXTI_Line12); } } }DMA中断服务函数规则通道使用DMA中断进行数据传输,在DMA中断服务函数中调用ADCFilter()函数对获取的AD值做滤波处理。void DMA1_Channel1_IRQHandler(void) { if(DMA_GetITStatus(DMA1_IT_TC1)) { DMA_ClearITPendingBit(DMA1_IT_TC1); ADCFilter(); } } 主函数 示例中将获取的AD值与3.3V比对,转换为ADC输入通道的电压,并间隔300ms打印。s32 main(void) { DELAY_Init(); CONSOLE_Init(115200); ADC1_ConfigInit(); ADC_SoftwareStartConvCmd(ADC1, ENABLE); while(1) { if(Flag_InjectConvert) { Flag_InjectConvert = 0; fValue = ((float)ADCVAL / 4095) * 3.3; // ADC injection channel printf("ADC1_CH_1 = %fVrnn", fValue); } if(Flag_ADCFilter) { Flag_ADCFilter = 0; //Convert the filtered value to voltage ADCVolatge = ((float)ADCFilterValue / 4095) * 3.3; //ADC regular channels printf("ADC1_CH_0 = %fVrnn", ADCVolatge); ADC_SoftwareStartConvCmd(ADC1, ENABLE); } DELAY_Ms(300); } } 演示 在开发板上将PA0(ADC1通道0)连接板上GND,将PA1(ADC1通道1)连接板上3.3V。 运行程序,开始时只有ADC1通道0(规则通道)进行AD转换。给PB12一个下降沿信号,此时外部事件触发ADC1通道1(注入通道)进行AD转换,通道0当前转换完成后停止AD转换,通道1进行转换直到结束,通道0进行AD转换。串口调试助手显示如下: |
|
相关推荐
|
|
只有小组成员才能发言,加入小组>>
2248个成员聚集在这个小组
加入小组灵动微电子MM32全系列MCU产品应用手册,库函数和例程和选型表
11657 浏览 3 评论
【MM32 eMiniBoard试用连载】+基于OLED12864的GUI---U8G2
5920 浏览 1 评论
【MM32 eMiniBoard试用连载】移植RT-Thread至MM32L373PS
10943 浏览 0 评论
【MM32 eMiniBoard测评报告】+ 开箱 + 初探
4568 浏览 1 评论
灵动微课堂(第106讲) | MM32 USB功能学习笔记 —— WinUSB设备
4296 浏览 1 评论
[MM32软件] MM32F002使用内部flash存储数据怎么操作?
962浏览 1评论
791浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 04:28 , Processed in 0.531325 second(s), Total 65, Slave 48 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号