STM32多通道ADC规则转换实现了

发布者:科技创客最新更新时间:2016-06-30 来源: eefocus关键字:STM32  多通道  ADC规则 手机看文章 扫描二维码
随时随地手机看文章
vu16 ADC_RCVTab[160] ;   //自己添加

 

/*******************************************************************************
* Function Name  : main
* Description    : Main program
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
int main(void)
{
#ifdef DEBUG
  debug();
#endif

  /* System clocks configuration ---------------------------------------------*/
  RCC_Configuration();

  /* NVIC configuration ------------------------------------------------------*/
  NVIC_Configuration();

  /* GPIO configuration ------------------------------------------------------*/
  GPIO_Configuration();

  LcdShow_Init();

  /* DMA1 channel1 configuration ----------------------------------------------*/

 

  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);//使能DMA时钟


  DMA_DeInit(DMA1_Channel1);
  DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;//外设地址
  DMA_InitStructure.DMA_MemoryBaseAddr = (u32)ADC_RCVTab;//内存地址
  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;//dma传输方向单向
  DMA_InitStructure.DMA_BufferSize = 160;//设置DMA在传输时缓冲区的长度 word
  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//设置DMA的外设递增模式,一个外设
  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;//设置DMA的内存递增模式,
  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;//外设数据字长
  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;//内存数据字长
  DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;//设置DMA的传输模式:连续不断的循环模式
  DMA_InitStructure.DMA_Priority = DMA_Priority_High;//设置DMA的优先级别
  DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;//设置DMA的2个memory中的变量互相访问
  DMA_Init(DMA1_Channel1, &DMA_InitStructure);
  
  /* Enable DMA1 channel1 */
  DMA_Cmd(DMA1_Channel1, ENABLE);

  /* ADC1 configuration ------------------------------------------------------*/
  ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;//独立工作模式
  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 = 8;//用于转换的通道数
  ADC_Init(ADC1, &ADC_InitStructure);

  /* ADC1 regular channels configuration [规则模式通道配置]*/ 
  ADC_RegularChannelConfig(ADC1, ADC_Channel_8 , 1, ADC_SampleTime_239Cycles5);
  ADC_RegularChannelConfig(ADC1, ADC_Channel_9 , 2, ADC_SampleTime_239Cycles5);
  ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 3, ADC_SampleTime_239Cycles5);
  ADC_RegularChannelConfig(ADC1, ADC_Channel_11, 4, ADC_SampleTime_239Cycles5);  
  ADC_RegularChannelConfig(ADC1, ADC_Channel_12, 5, ADC_SampleTime_239Cycles5);
  ADC_RegularChannelConfig(ADC1, ADC_Channel_13, 6, ADC_SampleTime_239Cycles5);
  ADC_RegularChannelConfig(ADC1, ADC_Channel_14, 7, ADC_SampleTime_239Cycles5);
  ADC_RegularChannelConfig(ADC1, ADC_Channel_15, 8, ADC_SampleTime_239Cycles5); 

  /* Enable ADC1 DMA [使能ADC1 DMA]*/
  ADC_DMACmd(ADC1, ENABLE);
  
  /* Enable ADC1 [使能ADC1]*/
  ADC_Cmd(ADC1, ENABLE); 

  /* Enable ADC1 reset calibaration register */   
  ADC_ResetCalibration(ADC1);
  /* Check the end of ADC1 reset calibration register */
  while(ADC_GetResetCalibrationStatus(ADC1));

  /* Start ADC1 calibaration */
  ADC_StartCalibration(ADC1);
  /* Check the end of ADC1 calibration */
  while(ADC_GetCalibrationStatus(ADC1));
  
  /* Start ADC1 Software Conversion */
  ADC_SoftwareStartConvCmd(ADC1, ENABLE);

 

  while(RESET==DMA_GetFlagStatus(DMA1_FLAG_TC1));   //自己添加
  
    while(1)
  {
    vu16 value1 = 0;
    vu16 value2 = 0; 
    vu16 value3 = 0;
    vu16 value4 = 0;
    vu16 value5 = 0; 
    vu16 value6 = 0; 
    vu16 value7 = 0; 
    vu16 value8 = 0;
 value1 = average(ADC_RCVTab,0);
 value2 = average(ADC_RCVTab,1); 
 value3 = average(ADC_RCVTab,2);
 value4 = average(ADC_RCVTab,3);
 value5 = average(ADC_RCVTab,4);
 value6 = average(ADC_RCVTab,5); 
 value7 = average(ADC_RCVTab,6);
 value8 = average(ADC_RCVTab,7); 
 
    u8 num1 = value3 % 10;
    u8 num2 = (value3 / 10) % 10;
    u8 num3= (value3 / 100) % 10;
    u8 num4 = value3 / 1000;
    if (num1 > 9)
      display[3] = num1 + (65 - 10);
    else
      display[3] = num1 + (48-0);

    if (num2 > 9)
      display[2] = num2 +(65 - 10);
    else
      display[2] = num2 + (48 - 0);

    if (num3>9)
      display[1]=num3+(65-10);
    else
      display[1]=num3+(48-0);

    if (num4>9)
      display[0]=num4+(65-10);
    else
      display[0]=num4+(48-0);

    write_string(display);
    delay();
  }
}

 

u16 average(vu16 ADCDataTab[], u16 nChannel)     //自己添加

   u16 averagevalue=0, maxvalue=0, minvalue=0xFFFF, i;

   for (i=0;i<20;i++) 
   { 
     averagevalue += *(ADCDataTab+nChannel+i*8);

  if(*(ADCDataTab+nChannel+i*8)>maxvalue)   
  maxvalue=*(ADCDataTab+nChannel+i*8);
    
  if(*(ADCDataTab+nChannel+i*8)   minvalue=*(ADCDataTab+nChannel+i*8);
 }

 return ((averagevalue-maxvalue-minvalue)/18);   //这样会耗时不可取 最好用 >>
 
}

关键字:STM32  多通道  ADC规则 引用地址:STM32多通道ADC规则转换实现了

上一篇:STM32开发板基础教程(十) - RTC初探
下一篇:ulink下在ram中调试stm32的方法

推荐阅读最新更新时间:2024-03-16 14:59

STM32 USMART调试组件
1、USMART是由ALIENTEK开发的一个灵巧的串口调试交互组件,通过它你可以通过串口助手调用程序里的任何函数,并执行。因此,你可以随意更改函数的输入参数(支持数字(10/16进制)、字符串、函数入口地址等作为参数),单个函数最多支持10个输入参数,并支持函数返回值显示。 2、USMART的特点 1.可以调用绝大部分用户直接编写的函数。 2.资源占用极少(最少情况:FLASH:4K; SRAM:72B)。 3.支持参数类型多(数字(包含10/16进制)、字符串、函数指针等)。 4.支持函数返回值显示。 5.支持参数及返回值格式设置。 6.支持函数执行时间计算。 7.使用方便。
[单片机]
STM32之蓝牙透传模块(昇润科技HY-254124 V8)
一、简介 本文介绍如何使用STM32控制蓝牙透传模块,蓝牙透传模块使用昇润科技的HY-254124 V8。 二、实验平台 库版本:STM32F10x_StdPeriph_Lib_V3.5.0 编译软件:MDK4.53 硬件平台:STM32开发板(主芯片stm32f103c8t6) 仿真器:JLINK 三、版权声明 四、实验前提 在进行本文步骤前,请先阅读并实现以下博文: 1、《STM32之NVIC》:http://blog.csdn.net/feilusia/article/details/52819709 2、《STM32之串口》:http://blog.csdn.net/feilus
[单片机]
<font color='red'>STM32</font>之蓝牙透传模块(昇润科技HY-254124 V8)
STM32学习笔记——SDIO(1)
对STM32的SDIO SD卡输入/输出模块摸索了一下,今天只看了POWER UP这个函数的实现。对SDIO编写驱动,需要参考SD卡的协议,我手上的SD卡协议是ver2.00的物理层简化协议。协议主要规定了主机(这里就是STM32)向SD卡写入的各种控制指令,以及SD卡的初始化过程状态转移图。了解SD卡从初始化状态转移图开始。 这个图看起来有点复杂,感觉无从下手,其实仔细瞧瞧就跟我们数电学的状态转移图差不多,框框里面是各种操作,箭头指向下一步操作,直线引出去的部分就是状态发生跳转的条件。首先上电(power-on),然后发出CMD0,再接着发送CMD8,有应答(response)判断为Ver2.00或更新的SDMC,无应答(n
[单片机]
<font color='red'>STM32</font>学习笔记——SDIO(1)
STM32 触摸屏触摸功能学习总结
学习触摸屏花了不少的时间,学习的进度有点像蜗牛,很慢,解决问题的速度也是一样。既然做出来了,就把自己在学习过程的遇到的问题和经验作一下总结。我觉得学习这部分知识的时候,比较重要的内容有:SPI的理解;触摸芯片的理解(特别是通道选择控制字的理解)【这部分内容在ADS7843的中文手册上讲解的还是比较详细的】;还有触摸校准的掌握【正点原子这部分讲的很好,我就是一直他的,只是没用到中断】。 要用到触摸屏首先就要对触摸屏的原理有一定的了解,我想这个是前提,也不用太多说的。就是当触笔触到屏上时,对应的位置就会产生相应大小的电压,输入到芯片,AD转换后得到一个数据。而触摸校准就是将接受到的原始模数转换值转换成屏幕像素坐标。
[单片机]
STM32基于3.5库的LED灯2
3.5的库在这里: http://www.51hei.com/mcu/2765.html #include stm32f10x.h /*********************************************************************** ************************************************************************/ GPIO_InitTypeDef GPIO_InitStructure; /*******************************************************************
[单片机]
重返STM32之---STM32定时器的误解
说是接触STM32都快3年了,说来也惭愧,很多东西都还没搞明白;应该也是因为英文水平有待提到的原因,不能正确的理解英文的含义,毕竟我们的语言思维是不一样的(找个借口吧哈哈)。 最近在用STM32的定时器,以前都是匆匆走过,由于自己想标准化自己的编程代码,所以这次很用心的用通用定时器写通用的延时函数,网上很多都是用的系统滴答时钟(SysTlck)来做的,但是想着自己要向操作系统方向发展,就不能用这个定时器了。 平时因为用的是滴答时钟来做的延时函数,就没怎么去深究;这次用通用定时来做的时候,发现问题一大把。首先就是定时器的时钟分频,第二个就是如何不用中断来实现定时。因为自己觉得对STM32很了解,所以就范范的写了代码,觉得自己肯定没问
[单片机]
重返<font color='red'>STM32</font>之---<font color='red'>STM32</font>定时器的误解
STM32 Flash 均衡保存算法
在实际应用中,经常需要在程序运行过程中保存或读取一些数据,这些数据在工作中经常会变化,而且掉电后也不能丢失,所以需要及时地进行存储,存储这些数据常用的存储器是 EEPROM。 STM32 虽然本身不带 EEPROM,但是它支持自编程技术,可以利用内部 FLASH 来模拟 EEPROM,这样不仅简化了设计,而且降低了成本。 FLASH 的擦写次数是有限的,一般是 10W 次, FLASH 单个存储单元bit只能从1变为0,而不能从0变成1。 想要变成1,只能 page 擦除,这里的 page 表示一个擦除单位,擦除过程就是把 page 所有的位都写1,这种硬件特性决定需要一种比较高效的写 flash 算法。 总不能一
[单片机]
基于STM32F100VBT6的32位MCU开发设计方案
STM32F100VBT6采用ARM Cortex™-M3 32位RISC内核,工作频率24MHz,集成了高速嵌入式存储器(闪存高达128kB、SRAM高达8kB)以及各种增强外设和连接到两条APB总线的I/O。所有器件提供两个I2C、两个SPI、一个HDMI CEC和多达3个USART标致通信接口以及一个12位ADC、两个12位DAC和六个通用16位定时器和PWM定时器。主要用在控制和用户接口、医疗设备、PC和游戏机外设、GPS平台、工业应用、PLC、逆变器、打印机、视频通信和HVAC等。 图1 STM32F100xx系列方框图 STM32F100xx简介 低/中密度、基于ARM的高级32位MCU,带有16 kB ~128
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved