完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
本帖最后由 MMCU5721167 于 2017-10-26 16:34 编辑 来源 灵动MM32 在很多应用场合,都会使用到定时器周期性触发ADC采样功能,比如:电机、控制电源、变频器等应用方案中,对ADC的采样点位置都有很严格的时间要求,如果采样点位置选择出现错误,会给整个系统造成不可预料的后果。在这里将针对MM32L073芯片的tiM1周期性触发ADC采样功能的编程配置方法做简单的说明。 在上一篇文章中为大家介绍了MM32的ADC的转换开始条件有两大类:软件启动和外部触发事件启动,其中外部触发事件启动又可分为EXTI引脚信号、Timer1/2/3匹配或者TRGO信号。通过查找MM32L0系列用户手册可知,控制ADC的转换开始条件的寄存器是A/D 控制寄存器(ADC_ADCR)。如下图所示,ADC的外部触发源选择有:TIM1_CC1 TIM1_CC2 TIM1_CC3 TIM2_CC2 TIM3_TRGO TIM3_CC1EXTI线11,MM32L073ADC的触发常规通道可以由上述任意一个信号触发,这里将以TIM3的CC1触发ADC转换为例。 ADC触发源选择 使用MM32L0系列的定时器,首先先来看一下定时器的框图,在MM32L0系列用户手册的通用定时器TIMx章节的图77通用定时器框图。 图中左边部分是通用定时器TIMx的自动重装寄存器和计数器寄存器,主要作用是输入捕获功能,右边是捕获比较寄存器,主要作用是输出比较模式。 输出通道有TIMx_CH1TIMx_CH2TIMx_CH3TIMx_CH4,其中还有互补通道,共4通道PWM端口。TIM3_CH1是ADC通道的触发源,在定时器每次比较匹配时,在TIM3_CH1上产生一次上升沿,触发ADC采样。 ADC配置如下所示: void ADC_Config(void) { ADC_InitTypeDef ADC_InitStructure; GPIO_InitTypeDefGPIO_InitStructure; //开GPIOA时钟和ADC1时钟 RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA,ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 GPIO_InitStructure.GPIO_Speed= GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode= GPIO_Mode_AIN;//模拟输入模式 GPIO_Init(GPIOA,&GPIO_InitStructure); //APB2 8分频为ADC时钟,APB2=48MHz,则ADC时钟为6MHz ADC_InitStructure.ADC_PRESCARE = ADC_PCLK2_PRESCARE_8; //单周期采样模式,软件或外部触发置位 ADST 开始,从最小序号通道到最大序//号通道的 A/D 转换,且在所有通道转换都完成后产生中断请求 ADC_InitStructure.ADC_Mode = ADC_Mode_Single_Period; //禁止持续转换模式,否则定时器只会触发一次,后续转换将一直进行 ADC_InitStructure.ADC_ContinuousConvMode= DISABLE; //数据右对齐 ADC_InitStructure.ADC_DataAlign= ADC_DataAlign_Right; //配置TIM3_CC1为触发源 ADC_InitStructure.ADC_ExternalTrigConv= ADC_ExternalTrigConv_T3_CC1; ADC_Init(ADC1, &ADC_InitStructure); //屏蔽所有通道 ADC_RegularChannelConfig(ADC1,DISABLE_ALL_CHANNEL , 0, 0); //使能选中通道 ADC_RegularChannelConfig(ADC1,ADC_Channel_1,0,ADC_SampleTime_13_5Cycles); //设置外部触发模式使能 ADC_ExternalTrigConvCmd(ADC1,ENABLE); //ADC1使能 ADC_Cmd(ADC1,ENABLE); } 定时器TIM3配置如下所示: void TIM3_PWM_Init(void) { GPIO_InitTypeDefGPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; //开启GPIOB时钟和ADC1时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE); RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE); //复用GPIOB.4TIM3_CH1功能 GPIO_PinAFConfig(GPIOB,GPIO_PinSource4,GPIO_AF_1); GPIO_InitStructure.GPIO_Pin= GPIO_Pin_4; //TIM3_CH1 GPIO_InitStructure.GPIO_Mode= GPIO_Mode_AF_PP; //复用推挽输出 GPIO_InitStructure.GPIO_Speed= GPIO_Speed_50MHz; GPIO_Init(GPIOB,&GPIO_InitStructure); //设置在下一次更新事件装入自动装载寄存器周期值 TIM_TimeBaseStructure.TIM_Period=10000; //设置时钟频率除数的预分频值 TIM_TimeBaseStructure.TIM_Prescaler=479; //设置时钟分割 TIM_TimeBaseStructure.TIM_ClockDivision= 0; //计数器交替向上向下计数,输出比较中断标志位在向上计数时被设置 TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_CenterAligned2; TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure); TIM_OCStructInit(&TIM_OCInitStructure); //在向上计数时,一旦 TIMx_CNT< TIMx_CCR1 时通道 1 为有效电平,否则为无效 //电平;在向下计数时,一旦 TIMx_CNT > TIMx_CCR1 时通道 1 为无效电平 //(OC1REF= 0),否则为有效电平(OC1REF = 1)。 TIM_OCInitStructure.TIM_OCMode= TIM_OCMode_PWM1; //输出使能 TIM_OCInitStructure.TIM_OutputState= TIM_OutputState_Enable; //设置待装入捕获比较寄存器的脉冲值 TIM_OCInitStructure.TIM_Pulse= 500; //输出空闲状态,高电平有效 TIM_OCInitStructure.TIM_OCPolarity= TIM_OCPolarity_High; TIM_OC1Init(TIM3,&TIM_OCInitStructure); //在 TIM1_CR1 寄存器中的自动装载预装载使能位(ARPE)的设置,预装载寄存器的//内容被立即或在每次的更新事件 UEV时传送到影子寄存器 TIM_OC1PreloadConfig(TIM3,TIM_OCPreload_Enable); //使能预装载寄存器 TIM_ARRPreloadConfig(TIM3,ENABLE); //TIM3使能 TIM_Cmd(TIM3, ENABLE); } 有时候,我们可能需要多个周期才进行一次AD触发采样及相关计算。如果时间是基于更新时刻又是定时周期的倍数,较为方便的办法就是使用定时器里的重复计数器(重复计数寄存器(TIMx_RCR))。在配置定时器基础功能,有一项是配置TIM_RepetitionCounter,这个参数就是往RCR寄存器中写入值,在用户没有配置该项时,复位值是0,基本配置如下: typedef struct { uint32_t TIM_Prescaler; /*! uint32_t TIM_CounterMode; /*! uint32_t TIM_Period; /*!< Auto-Reload Register at thenext update event. This parameter must be a number between 0x0000 and 0xFFFF*/ uint32_t TIM_ClockDivision; /*!< Specifies the clockdivision. This parameter can be a value of @ref TIM_Clock_Division_CKD */ uint8_t TIM_RepetitionCounter; /*!< Specifies therepetition counter value. Each time the RCR downcounter */ } TIM_TimeBaseInitTypeDef; 重复计数寄存器配置不同模式下更新速率 |
|
相关推荐 |
|
只有小组成员才能发言,加入小组>>
2247个成员聚集在这个小组
加入小组灵动微电子MM32全系列MCU产品应用手册,库函数和例程和选型表
11613 浏览 3 评论
【MM32 eMiniBoard试用连载】+基于OLED12864的GUI---U8G2
5913 浏览 1 评论
【MM32 eMiniBoard试用连载】移植RT-Thread至MM32L373PS
10896 浏览 0 评论
【MM32 eMiniBoard测评报告】+ 开箱 + 初探
4562 浏览 1 评论
灵动微课堂(第106讲) | MM32 USB功能学习笔记 —— WinUSB设备
4288 浏览 1 评论
[MM32软件] MM32F002使用内部flash存储数据怎么操作?
951浏览 1评论
774浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-15 20:16 , Processed in 0.629547 second(s), Total 55, Slave 41 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号