stm32之TIM+ADC+DMA采集50HZ交流信号

http://cache.baiducontent.com/c?m=9d78d513d98207f04fece47f0d01d7174a02d1743ca6c76409c3e03984145b563710f4bb56644b5bc7823c390ef50f1aa8e737012a1e65f2dedf883d80f9c57478de6323706bd71c4dce5ff58b11769737902cefaa18ecb9e732e5adc5d3a95744ca245f3cdfae&p=8b2a975fca9d5bff57ee947a5b47cc&newp=9133c64ad49614f543bd9b7d0d12cc231610db2151d2d401298ffe0cc4241a1a1a3aecbf21231a01d0ce786c0aaa4e57e1f03772350034f1f689df08d2ecce7e7add7d2f&user=baidu&fm=sc&query=stm32+adc+%CD%AC%B2%BD%A1%A1tim&qid=809b98c2000086f6&p1=4

void ADC_DMA_Config(void)
{
 DMA_InitTypeDef DMA_InitStructure;              
 RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
 DMA_DeInit(DMA1_Channel1);  //DMA复位
 DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&ADC1->DR;  //外设的地址
 DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&ADC_ConvertedValue;  //存储区的起始地址
 DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;  //DMA传输方向到内部存储区
 DMA_InitStructure.DMA_BufferSize = ADC_NUM;  //ADC转换的次数
 DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;                 //外设地址不变
 DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;                          //内存地址递增
 DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;  //ADC数据长度为16位
 DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;  //存储区数据长度为16位
 DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;  //DMA工作方式为循环工作
 DMA_InitStructure.DMA_Priority = DMA_Priority_High;  //DMA 优先级高
 DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;  //存储器对存储器关闭
 DMA_Init(DMA1_Channel1, &DMA_InitStructure);  //DMA通道初始化
 DMA_Cmd(DMA1_Channel1,ENABLE);  //DMA使能
}

void ADC_START(void)
 {
    ADC1, ENABLE);    //ADC的DMA功能开启
   ADC1);  //ADC_GetResetCalibrationStatus(ADC等待完成
   ADC1);                                                    //开始校准
   while(ADC1));  //ADC_SoftwareStartConvCmd(ADC的软件转换启动功能
  }
void ADC1_Config(void)
{
 GPIO_InitTypeDef GPIO_InitStructure;
 ADC_InitStructure;     
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);                         ////PA4567时钟使能
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);                         ////PC45时钟使能
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);                         ////PB01时钟使能     
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7; ////初始化PA4567为模拟输入
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //管脚设为模拟输入
 GPIO_Init(GPIOA, &GPIO_InitStructure);
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_5;     ////初始化PC45为模拟输入
 GPIO_Init(GPIOC, &GPIO_InitStructure);
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1; ////初始化PB0 1为模拟输入
 GPIO_Init(GPIOB, &GPIO_InitStructure);
 ADC设置
  
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC时钟
 ADC_Mode = ADC1和ADC2工作在独立模式 
 ADC_ScanConvMode = ENABLE;                                        //多通道
 ///ADC_ContinuousConvMode = ENABLE;                               //连续转换
 ADC_ContinuousConvMode = DISABLE;                              //连续转换
 ADC_ExternalTrigConv = ADC_ExternalTrigConv_T2_CC2;
 ///ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;             //软件启动转换
 ADC_DataAlign = ADC_DataAlign_Right;                             //转换结果右对齐
 ADC_NbrOfChannel = ADC_NUM;                                      //通道数目
 ADC1, &ADC_InitStructure);  
/// ADC_TempSensorVrefintCmd(ENABLE);                                            //使能片内温度传感器  
/// RCC_ADCCLKConfig(RCC_PCLK2_Div6);                                            //PCLK 6分频
 RCC_ADCCLKConfig(RCC_PCLK2_Div8);                                               //ADC_RegularChannelConfig(ADC_Channel_4,  1, ADC_SampleTime_239Cycles5);  //通道4,转换次序,转换时间
 ADC1, ADC_SampleTime_239Cycles5);  //通道5,转换次序,转换时间
 ADC1, ADC_SampleTime_239Cycles5);  //通道6,转换次序,转换时间
 ADC1, ADC_SampleTime_239Cycles5);  //通道7,转换次序,转换时间
 ADC1, ADC_SampleTime_239Cycles5);  //通道8,转换次序,转换时间
 ADC1, ADC_SampleTime_239Cycles5);  //通道9,转换次序,转换时间
 ADC1, ADC_SampleTime_239Cycles5);  //通道14,转换次序,转换时间
 ADC1, ADC_SampleTime_239Cycles5);  //通道15,转换次序,转换时间
// ADC1, ADC_SampleTime_239Cycles5);
 ADC_START();
}
/*
 系统时钟为72MHZ,FPCLK2=72 000 000HZ
 对50HZ交流信号进行采集,一个周期为20MS, 采集8路信号,每个信号采用64次,
 20*1000us/64=312us,即每隔312us要启动一次采集信号(需要采集8路信号),采集64次后正好是一个周期;
 采集一次8路的时间:(239.5+12.5)*8/9M =224us

*/
 void TIM2_Configuration(void) 
 { 
  TIM_TimeBaseStructure; 
  TIM_OCInitStructure;  
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); 
  TIM_Period    = 312;                             //设置一个周期0.312ms 
  TIM_Prescaler = 71;                           //系统主频72M,这里分频72,相当于1000K的定时器2时钟 
  TIM_ClockDivision = 0x0; 
  TIM_CounterMode = TIM_CounterMode_Up;          /////
  TIM2, & TIM_TimeBaseStructure); 
  TIM_OCMode = TIM_OCMode_PWM1;                     //下面详细说明  
  TIM_OutputState = TIM_OutputState_Disable; 
  TIM_Pulse = 20; /////
  TIM_OCPolarity = TIM_OCPolarity_Low;              //如果是PWM1要为Low,PWM2则为High
  TIM2, & TIM_OCInitStructure);    
  TIM2, ENABLE);   
  TIM2); 
  TIM2, TIM_OCPreload_Enable); 
  TIM2, DISABLE); 
  }

时间: 07-10

stm32之TIM+ADC+DMA采集50HZ交流信号的相关文章

STM32 F4 ADC DMA Temperature Sensor

STM32 F4 ADC DMA Temperature Sensor Goal: detecting temperature variations using a temperature sensor, ADC with DMA and TIM3 as a trigger (ADC sampling frequency = TIM3 trigger frequency). Note: Using TIM3 as a trigger is suited for monitoring temper

STM32的串口采用DMA方式接收数据测试(转)

STM32的串口采用DMA方式接收数据测试 本文博客链接:http://blog.csdn.net/jdh99,作者:jdh,转载请注明.   参考链接:http://www.amobbs.com/forum.PHP?mod=viewthread&tid=5511863&highlight=dma%E6%8E%A5%E6%94%B6   环境: 主机:WINXP 开发环境:MDK4.23 MCU:STM32F103CBT6 说明: 串口可以配置成用DMA的方式接收数据,不过DMA需要定长才

关于Stm32定时器+ADC+DMA进行AD采样的实现

Stm32的ADC有DMA功能这都毋庸置疑,也是我们用的最多的!然而,如果我们要对一个信号(比如脉搏信号)进行定时采样(也就是隔一段时间,比如说2ms),有三种方法: 1.使用定时器中断每隔一定时间进行ADC转换,这样每次都必须读ADC的数据寄存器,非常浪费时间! 2.把ADC设置成连续转换模式,同时对应的DMA通道开启循环模式,这样ADC就一直在进行数据采集然后通过DMA把数据搬运至内存.但是这样做的话还得加一个定时中断,用来定时读取内存中的数据! 3.使用ADC的定时器触发ADC转换的功能,

STM32——ADC

STM32--ADC 宗旨:技术的学习是有限的,分享的精神的无限的. 一.ADC指标 有 18 个通道,可测量 16 个外部和 2 个内部信号源.各通道的 A/D 转换可以单次.连续.扫描或间断模式执行 :ADC的结果可以左对齐或右对齐方式存储在 16 位数据寄存器中 :模拟看门狗特性允许应用程序检测输入电压是否超出用户定义的高 / 低阈值. 对于 ADC 来说,我们最关注的就是它的分辨率.转换时间.ADC 类型.参考电压范围: (1)分辨率:12 位分辨率.不能直接测量负电压,所以没有符号位,

STM32的串口DMA收发以及双缓冲区的实现

在使用STM32的UART的DMA功能总结如下: 首先上代码,这里采用STM32 的USART1作为Demo,RX的DMA为DMA1_Channel5,TX的DMA为DMA1_Channel4.初始化如下,红色的标记需要注意: RX-DMA初始化 1 // DMA Rx 2 USART_DMACmd(USART1,USART_DMAReq_Rx,ENABLE); 3 DMA_Cmd(DMA1_Channel5,DISABLE); 4 DMA_InitStruct.DMA_PeripheralBa

STM32 UART DMA实现未知数据长度接收

串口通信是经常使用到的功能,在STM32中UART具有DMA功能,并且收发都可以使用DMA,使用DMA发送基本上大家不会遇到什么问题,因为发送的时候会告知DMA发送的数据长度,DMA按照发送的长度直接发送就OK了,但是使用DMA接收时候就不同了,因为有时候数据接收并不是每一次都是定长的,但是DMA只在接收数据长度和设定数据长度相同的时候才可以触发中断,告诉MCU数据接收完毕,针对这个问题,解决方法如下,有一点复杂,但是很管用. UART在传输一个字节的时候,首先拉低,传输起始位,然后在是LSB

DMA(STM32)

1.DMA:data memory access //实际的内存存储 注:DMA干活的时候是不需要CPU干涉的 2. ①内存(定义的变量)---外设(寄存器): ②内存---内存 ③外设---外设(一个外设的寄存器到另一个外设的寄存器) 3. STM32有两个DMA控制器 如图: 4.举例说明:(内存到外设,串口1 TX DMA) 1 void USART1_DMA_Config(void) 2 { 3 DMA_InitTypeDef DMA_InitStructure; 4 5 /*Open

stm32之ADC学习

1.stm32中采用的是逐次逼近型模拟数字方式,那么什么是逐次逼近呢? 逐次逼近的方式类似于二分法,以8位数据为例:当输入一个模拟量的时候,首先取这8位数的一半,即1000 0000,与模拟量比较,大于输入值,则变为1,小于则比较下一位:将下一位设为1,然后比较,大于则为0,小于则不变,直到两个数字相差不大时停止比较,输出结果. 2.ADC中的对齐方式指的是什么? 由于stm32中的ADC转换结果是12位的,而数据存储寄存器是16位的.左对齐,就是12位的最高位是寄存器的最高位,低四位没有数据:

adc mda 的一些配置,,,非常感谢分享这些内容的人

1.  对于ADC来说,我们关注的是它的分辨率.转换速度.ADC类型.参考电压范围. A. 分辨率,12位分辨率,最小量化单位LSB=VREF+/212 B. 转换时间,可编程的,采样一次至少要用14个ADC时钟周期,而ADC时钟频率最高为14MHz,也就是说它的最短采样时间为1us C. ADC类型,类型决定了性能的极限,stm32是逐次比较型ADC D. 参考电压范围,当需要测量负电压或测量的信号超出范围时,要先经过运算电路进行平移或利用电阻分压 2.  ADC工作过程分析,ADC部件要受到

ADC

  stm32f207,  引脚对应的模拟通道: PA0 IN0, PA1 PA2 PA3 PA4 PA5 PA6 PA7 IN PB0 IN8 PB1 IN9 PC0 IN10 PC1 PC2 PC3  PC4 IN14 PC5 IN15  ADC采样转换时间 ADC转换就是输入模拟的信号量,单片机转换成数字量.读取数字量必须等转换完成后,完成一个通道的读取叫做采样周期.采样周期一般来说=转换时间+读取时间.而转换时间=采样时间+12.5个时钟周期.采样时间是你通过寄存器告诉stm32采样模拟