当前位置:首页 > 单片机 > 单片机
[导读] 注:此STM32单片机为STM32F103系列的Stm32的ADC有DMA功能这都毋庸置疑,也是我们用的最多的!然而,如果我们要对一个信号(比如脉搏信号)进行定时采样(也就是隔一段时间,比如说2ms),有三种方法:1、

 

注:此STM32单片机为STM32F103系列的
Stm32的ADC有DMA功能这都毋庸置疑,也是我们用的最多的!然而,如果我们要对一个信号(比如脉搏信号)进行定时采样(也就是隔一段时间,比如说2ms),有三种方法:

1、使用定时器中断每隔一定时间进行ADC转换,这样每次都必须读ADC的数据寄存器,非常浪费时间!

2、把ADC设置成连续转换模式,同时对应的DMA通道开启循环模式,这样ADC就一直在进行数据采集然后通过DMA把数据搬运至内存。但是这样做的话还得加一个定时中断,用来定时读取内存中的数据!

3、使用ADC的定时器触发ADC转换的功能,然后使用DMA进行数据的搬运!这样只要设置好定时器的触发间隔,就能实现ADC定时采样转换的功能,然后可以在程序的死循环中一直检测DMA转换完成标志,然后进行数据的读取,或者使能DMA转换完成中断,这样每次转换完成就会产生中断,我是采用第二种方法。下面上代码:我这里使用的单通道
//定时器初始化
voidTIM2_Configuration(void)
{
TIM_TimeBaseInitTypeDefTIM_TimeBaseStructure;
TIM_OCInitTypeDefTIM_OCInitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
TIM_TimeBaseStructure.TIM_Period=1999;//设置2ms一次TIM2比较的周期
TIM_TimeBaseStructure.TIM_Prescaler=71;//系统主频72M,这里分频71,相当于1000K的定时器2时钟
TIM_TimeBaseStructure.TIM_ClockDivision=0x0;
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);

TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;//下面详细说明
TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;//TIM_OutputState_Disable;
TIM_OCInitStructure.TIM_Pulse=1000;
TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_Low;//如果是PWM1要为Low,PWM2则为High
TIM_OC2Init(TIM2,&TIM_OCInitStructure);
//TIM_InternalClockConfig(TIM2);
//TIM_OC2PreloadConfig(TIM2,TIM_OCPreload_Enable);
//TIM_UpdateDisableConfig(TIM2,DISABLE);
}
//ADC_DMA初始化配置
voidADC_DMA_Config(void)
{
DMA_InitTypeDefDMA_InitStructure;//注:ADC为12位模数转换器,只有ADCConvertedValue的低12位有效
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);//使能DMA时钟
DMA_DeInit(DMA1_Channel1);//开启DMA1的第一通道
DMA_InitStructure.DMA_PeripheralBaseAddr=ADC1_DR_Address;//DMA对应的外设基地址
DMA_InitStructure.DMA_MemoryBaseAddr=(uint32_t)&ADCConvertedValue;//内存存储基地址
DMA_InitStructure.DMA_DIR=DMA_DIR_PeripheralSRC;//DMA的转换模式为SRC模式,由外设搬移到内存
DMA_InitStructure.DMA_BufferSize=1;//DMA缓存大小,1个
DMA_InitStructure.DMA_PeripheralInc=DMA_PeripheralInc_Disable;//接收一次数据后,设备地址禁止后移
DMA_InitStructure.DMA_MemoryInc=DMA_MemoryInc_Disable;//关闭接收一次数据后,目标内存地址后移
DMA_InitStructure.DMA_PeripheralDataSize=DMA_PeripheralDataSize_HalfWord;//定义外设数据宽度为16位
DMA_InitStructure.DMA_MemoryDataSize=DMA_MemoryDataSize_HalfWord;//DMA搬移数据尺寸,HalfWord就是为16位
DMA_InitStructure.DMA_Mode=DMA_Mode_Circular;//循环转换模式
DMA_InitStructure.DMA_Priority=DMA_Priority_High;//DMA优先级高
DMA_InitStructure.DMA_M2M=DMA_M2M_Disable;//M2M模式禁用
DMA_Init(DMA1_Channel1,&DMA_InitStructure);
DMA_ITConfig(DMA1_Channel1,DMA_IT_TC,ENABLE);//使能传输完成中断
}
//ADC初始化
voidPulseSenosrInit(void)
{
//当外部触发信号被选为ADC规则或注入转换时,只有它的上升沿可以启动转换
ADC_InitTypeDefADC_InitStructure;
ADC_GPIO_Configuration();//IO口配置
TIM2_Configuration();//定时器配置
ADC_DMA_Config();//ADC_DMA配置
ADC_InitStructure.ADC_Mode=ADC_Mode_Independent;//独立的转换模式ADC_DUALMOD[3:0]=0000;
ADC_InitStructure.ADC_ScanConvMode=DISABLE;//关闭扫描模式因为只有一个通道
ADC_InitStructure.ADC_ContinuousConvMode=DISABLE;//关闭连续转换模式否则只要触发一次,
//后续的转换就会永不停歇(除非CONT清0),这样第一次以后的ADC,就不是由TIM2_CC2来触发了
ADC_InitStructure.ADC_ExternalTrigConv=ADC_ExternalTrigConv_T2_CC2;//软件转换模式
ADC_InitStructure.ADC_DataAlign=ADC_DataAlign_Right;//对齐方式,ADC为12位中,右对齐方式ADC_ALIGN=0;
ADC_InitStructure.ADC_NbrOfChannel=1;//开启通道数,1个ADC_SQR1[23:20]=0000;
//ADC_SQR1[23:20]设置通道数目的选择
ADC_Init(ADC1,&ADC_InitStructure);
//RCC_ADCCLKConfig(RCC_PCLK2_Div6);//配置时钟(12MHz),在RCC里面还应配置APB2=AHB时钟72MHz

ADC_RegularChannelConfig(ADC1,ADC_Channel_2,1,ADC_SampleTime_1Cycles5);
//ADC_SMPR2ADC_SMPR1设置每个通道的采样时间
//ADC_SQR1[19:0]?DC_SQR1[29:0]?DC_SQR3[29:0]设置对应通道的转换顺序适用于多通道采样
//ADC通道组,第3个通道采样顺序1,转换时间
ADC_ExternalTrigConvCmd(ADC1,ENABLE);//设置外部触发模式使能(这个“外部“其实仅仅是相//对于ADC模块的外部,

ADC_DMACmd(ADC1,ENABLE);

ADC_Cmd(ADC1,ENABLE);//ADC命令,使能ADC_ADON=1

ADC_ResetCalibration(ADC1);//重新校准

while(ADC_GetResetCalibrationStatus(ADC1));//等待重新校准完成

ADC_StartCalibration(ADC1);//开始校准ADC_RSTCAL=1;初始化校准寄存器

while(ADC_GetCalibrationStatus(ADC1));//等待校准完成ADC_CAL=0;

//ADC_SoftwareStartConvCmd(ADC1,ENABLE);//连续转换开始,ADC通过DMA方式不断的更新RAM区。
//ADC_SWSTART=1开始规则转换切记软件触发也属于外部事件要设置ADC_EXTTRIG=1
//////实际上还是在STM32内部)
TIM_Cmd(TIM2,ENABLE);//最后面打开定时器使能
DMA_Cmd(DMA1_Channel1,ENABLE);//使能DMA
}
//中断处理函数
voidDMA1_Channel1_IRQHandler(void)
{
if(DMA_GetITStatus(DMA1_IT_TC1)!=RESET){
//自己的中断处理代码但是记住程序不要太复杂最好不要超过中断时间
DMA_ClearITPendingBit(DMA1_IT_TC1);
}
}
//中断配置
NVIC_InitTypeDefNVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
NVIC_InitStructure.NVIC_IRQChannel=DMA1_Channel1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStructure);
voidADC_GPIO_Configuration(void)//ADC配置函数
{
GPIO_InitTypeDefGPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1|RCC_APB2Periph_GPIOA,ENABLE);//使能ADC和GPIOA时钟
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2;//管脚2
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;//模拟输入模式
GPIO_Init(GPIOA,&GPIO_InitStructure);//GPIO组
}

 

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

Holtek新推出BS67F2432具备触控按键、高精准度HIRC与LCD驱动器Flash MCU。主要特色为内建高精准度4MHz HIRC振荡电路、8路触控按键及最大支持4COM×15SEG LCD驱动器。适用于触控接...

关键字: MCU LCD驱动器 定时器

Holtek持续扩展Touch A/D Flash MCU产品,新增系列成员BS86C12CA,延续优良抗干扰特性,提供丰富的定时器资源并支持LXT振荡器。引脚与BS86C08C及BS86D12C相容,具高性价比,适合需...

关键字: MCU LXT振荡器 定时器

采用MCU(微控制器单元)模块实现定时器的设计是通过利用MCU内部的定时器/计数器资源来实现的。定时器是MCU中的一个重要功能模块,它可以在特定的时间间隔内执行特定的操作,如产生中断、更新定时器值、触发其他设备等。

关键字: mcu模块 定时器

单片机的外设是指与单片机核心处理部分相连的附加硬件模块,它们能够扩展单片机的功能和能力。这些外设包括各种模块和接口,用于处理特定的任务或实现特定的功能。

关键字: 单片机 定时器

PIC单片机是基于RISC系统结构的单片机,最初的设计是支持PDP(编程数据处理器)计算机。大量的操作可以用来控制外围设备。PIC单片机比微控制器具有更快的程序执行能力。它是由微芯片技术公司于1889年发明的,是一种8位...

关键字: PIC单片机 定时器 中断

外部输入、输出继电器、内部继电器、定时器、计数器等器件的接点可多次重复使用,无需用复杂的程序结构来减少接点的使用次数。

关键字: plc编程 定时器 计数器

单片机可以通过“定时/计数模式选择位C/T”令定时/计数器工作于定时或计数模式下,也可通过“工作方式选择位M1M0”设定其工作方式。C/T和M1M0等与定时/计数器有关的位在寄存器TCON或TMOD中,见表4-8和表4-...

关键字: 寄存器 计数器 定时器

在家电产品和工业应用系统中,定时和计数是两种常用的功能,如:微波炉加热计时和流水线上产品数目统计等。MCS-51单片机内部集成的两个可编程定时/计数器T0和T1使用灵活、方便,在仪器仪表等工业产品中应用广泛。

关键字: 计数器 定时器 单片机

TMOD 的地址是 89H ,它不能位寻址 ,它里面的内容被称为方式字,设置时一次写入,其各位的定义如图 6.2 所示。高 4 位用于定时器 T1 ,低 4 位用于定时器 T0 。

关键字: 定时器 计数器 单片机

单片机定时器其实跟我们平时常说的计数器,是同一个电子元件,只不过计数器记录的是单片机外部情况,所接收的也是外部脉冲,而定时器则是由单片机自身提供的一个非常稳定的计数器,这个稳定的计数器就是单片机上连接的晶振部件。

关键字: 定时器 计数器 单片机
关闭
关闭