历史上的今天
返回首页

历史上的今天

今天是:2024年12月06日(星期五)

正在发生

2020年12月06日 | STM32 —— 多路ADC采集

2020-12-06 来源:eefocus


#ifndef _ADC_H_

#define _ADC_H_

 

#include "type.h"

#include "debug.h"

 

void ADCInit(void);

uint16_t ADCGetData(uint8_t channel);

uint16_t ADCGetAverage(uint8_t channel, uint8_t times);

 

#ifndef CONFIG_CAN

void adc_test(void);

#endif

 

#endif /* _ADC_H_ */

// input1~5 -- 模拟量IO口; input6~10 -- 普通IO口用

#define ADC_CHANNEL        ADC1

 

#define AD_INPUT1_GRP      GPIOC

#define AD_INPUT1_INDEX    GPIO_Pin_0

#define AD_INPUT2_GRP      GPIOC

#define AD_INPUT2_INDEX    GPIO_Pin_1

#define AD_INPUT3_GRP      GPIOC

#define AD_INPUT3_INDEX    GPIO_Pin_2

#define AD_INPUT4_GRP      GPIOC

#define AD_INPUT4_INDEX    GPIO_Pin_3

#define AD_INPUT5_GRP      GPIOA

#define AD_INPUT5_INDEX    GPIO_Pin_2

 

#if 0

#define AD_INPUT6_GRP      GPIOA

#define AD_INPUT6_INDEX    GPIO_Pin_3

#define AD_INPUT7_GRP      GPIOC

#define AD_INPUT7_INDEX    GPIO_Pin_4

#define AD_INPUT8_GRP      GPIOC

#define AD_INPUT8_INDEX    GPIO_Pin_5

#define AD_INPUT9_GRP      GPIOB

#define AD_INPUT9_INDEX    GPIO_Pin_0

#define AD_INPUT10_GRP     GPIOB

#define AD_INPUT10_INDEX   GPIO_Pin_1

#endif

#define AD_INPUT_CONFIG(gpio, pos)  GPIOConfig(gpio, pos, GPIO_Mode_AIN)


#include "adc.h"

#include "stm32f10x.h"

#include "delay.h"

#include "target.h"

 

#define ADC_CHANNEL_NUM  5

 

static uint16_t ad_value[ADC_CHANNEL_NUM] = {0};

 

static void adc_gpio_clk_init(void)

{

  RCC_ADCCLKConfig(RCC_PCLK2_Div6);

}

 

static void adc_gpio_init(void)

{

  adc_gpio_clk_init();

 

  AD_INPUT_CONFIG(AD_INPUT1_GRP, AD_INPUT1_INDEX | AD_INPUT2_INDEX | AD_INPUT3_INDEX | AD_INPUT4_INDEX);

  AD_INPUT_CONFIG(AD_INPUT5_GRP, AD_INPUT5_INDEX);

  ADC_DeInit(ADC_CHANNEL);

}

 

static void adc_dma_init(void)

{

  DMA_InitTypeDef DMA_InitStructure;

  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);

 

  DMA_DeInit(DMA1_Channel1);

 

  DMA_InitStructure.DMA_PeripheralBaseAddr  = (u32) & (ADC1->DR);

  DMA_InitStructure.DMA_MemoryBaseAddr      = (u32)&ad_value;

  DMA_InitStructure.DMA_DIR                 = DMA_DIR_PeripheralSRC;

  DMA_InitStructure.DMA_M2M                 = DMA_M2M_Disable;

  DMA_InitStructure.DMA_PeripheralDataSize  = DMA_PeripheralDataSize_HalfWord;

  DMA_InitStructure.DMA_MemoryDataSize      = DMA_MemoryDataSize_HalfWord;

  DMA_InitStructure.DMA_BufferSize          = ADC_CHANNEL_NUM;

  DMA_InitStructure.DMA_MemoryInc           = DMA_MemoryInc_Enable;

  DMA_InitStructure.DMA_PeripheralInc       = DMA_PeripheralInc_Disable;

  DMA_InitStructure.DMA_Mode                = DMA_Mode_Circular;

  DMA_InitStructure.DMA_Priority            = DMA_Priority_High;

  DMA_Init(DMA1_Channel1, &DMA_InitStructure);

}

 

static void adc_init()

{

  ADC_InitTypeDef ADC_InitStructure;

 

  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 = ADC_CHANNEL_NUM;

  ADC_Init(ADC_CHANNEL, &ADC_InitStructure);

 

  ADC_RegularChannelConfig(ADC_CHANNEL, ADC_Channel_0, 1, ADC_SampleTime_55Cycles5);

  ADC_RegularChannelConfig(ADC_CHANNEL, ADC_Channel_1, 2, ADC_SampleTime_55Cycles5);

  ADC_RegularChannelConfig(ADC_CHANNEL, ADC_Channel_2, 3, ADC_SampleTime_55Cycles5);

  ADC_RegularChannelConfig(ADC_CHANNEL, ADC_Channel_3, 4, ADC_SampleTime_55Cycles5);

  ADC_RegularChannelConfig(ADC_CHANNEL, ADC_Channel_4, 5, ADC_SampleTime_55Cycles5);

 

  ADC_DMACmd(ADC_CHANNEL, ENABLE);

 

  ADC_Cmd(ADC_CHANNEL, ENABLE);

 

  ADC_ResetCalibration(ADC_CHANNEL);

 

  while(ADC_GetResetCalibrationStatus(ADC_CHANNEL));

 

  ADC_StartCalibration(ADC_CHANNEL);

 

  while(ADC_GetCalibrationStatus(ADC_CHANNEL));

}

 

static void adc_start(void)

{

  ADC_SoftwareStartConvCmd(ADC_CHANNEL, ENABLE); // start convert

  DMA_Cmd(DMA1_Channel1, ENABLE);

}

 

void  ADCInit(void)

{

  adc_gpio_init();

  adc_dma_init();

  adc_init();

  adc_start();

}

 

uint16_t ADCGetData(uint8_t channel)

{

  uint16_t ret = 0;

  switch(channel)

  {

  case ADC_Channel_0:

    ret = ad_value[0];

    break;

  case ADC_Channel_1:

    ret = ad_value[1];

    break;

  case ADC_Channel_2:

    ret = ad_value[2];

    break;

  case ADC_Channel_3:

    ret = ad_value[3];

    break;

  case ADC_Channel_4:

    ret = ad_value[4];

    break;

  }

 

  return ret;

}

 

uint16_t ADCGetAverage(uint8_t channel, uint8_t times)

{

  uint16_t value;

  int i;

 

  for(i = 0; i < times; ++i)

  {

    value += ADCGetData(channel);

  }

 

  return (value / times);

}

 

#ifndef CONFIG_ADC

void adc_test(void)

{

  uint16_t buffer[ADC_CHANNEL_NUM];

  float temp[ADC_CHANNEL_NUM];

 

  buffer[0] = ADCGetData(ADC_Channel_0);

  temp[0] = (float)buffer[0] * 3.3 / 4096;

  printf("temp[0]: %frn", temp[0]);

 

  buffer[1] = ADCGetData(ADC_Channel_1);

  temp[1] = (float)buffer[1] * 3.3 / 4096;

  printf("temp[1]: %frn", temp[1]);

 

  buffer[2] = ADCGetData(ADC_Channel_2);

  temp[2] = (float)buffer[2] * 3.3 / 4096;

  printf("temp[2]: %frn", temp[2]);

 

  buffer[3] = ADCGetData(ADC_Channel_1);

  temp[3] = (float)buffer[3] * 3.3 / 4096;

  printf("temp[1]: %frn", temp[3]);

 

  buffer[4] = ADCGetData(ADC_Channel_4);

  temp[4] = (float)buffer[4] * 3.3 / 4096;

  printf("temp[2]: %frn", temp[4]);

}

#endif


推荐阅读

史海拾趣

遨格芯微(AGM)公司的发展小趣事

遨格芯微(AGM)自2012年成立以来,始终致力于可编程逻辑技术的研发。经过数年的努力,AGM成功开发出具有自主知识产权的FPGA核心技术,并在FPGA编译软件和电路领域取得了先进和成熟的技术成果。2014年,AGM的PLD芯片成熟并开始在行业得到应用,这标志着AGM在可编程逻辑技术领域取得了重大突破。随后,AGM推出三个系列的CPLD、FPGA、Programmable SoC产品,并进入量产阶段,得到了包括三星在内的多家知名厂商的认证,为公司的进一步发展奠定了坚实基础。

Analog Power公司的发展小趣事

随着技术的不断进步,Analog Power公司始终保持着对技术创新的热情。他们不断研发新的电源管理技术和产品,推出了一系列具有高性能、高效率、低功耗特点的电源管理解决方案。这些创新产品不仅满足了客户的需求,也引领了市场的发展潮流,使得Analog Power在行业中逐渐崭露头角。

Box Enclosures公司的发展小趣事

在市场竞争日益激烈的背景下,Box Enclosures公司意识到单打独斗难以取得更大的突破。于是,公司开始积极寻求与其他企业的战略合作。通过与一家知名电子设备制造商的合作,Box Enclosures成功将其产品集成到对方的产品中,共同开拓市场。这种合作不仅提升了公司的知名度,还为其带来了更多的商业机会和合作伙伴。

AMI Semiconductor公司的发展小趣事

随着国内市场的逐渐饱和,Box Enclosures公司决定将目光投向海外市场。公司制定了一系列国际化战略,包括参加国际电子展会、建立海外销售网络等。经过几年的努力,Box Enclosures的产品逐渐打入国际市场,赢得了众多海外客户的青睐。这一国际化战略为公司带来了更广阔的发展空间。

General Instrument公司的发展小趣事
线路中存在异常干扰信号,使保护器接收到错误的电压信号。
南京中科微公司的发展小趣事

南京中科微电子有限公司(CSM)的创立源于一群海归科学家和工程师的激情与梦想。他们曾在国外知名半导体公司如Marvell、ADI、Linear Tech等积累了丰富的研发经验,并在国家重点研究院所中从事前沿研究。这群人深感国内在射频/模拟关键芯片领域的落后,于是决定回国创立CSM,旨在打破国外技术垄断,实现自主创新和产业化。

问答坊 | AI 解惑

无聊,大家一起休闲下~~

http://www.hougong.info/?fromuid=92961…

查看全部问答>

关于如何学习嵌入式 高手 们进

大家好,我是一名大三的学生,学的是嵌入式方向的,但我们现在才学嵌入式操作系统,都TMD还是理论,学了等于没学,就上学期还学了个汇编,现在一学期都快过完了,感觉什么关于嵌入式方面的都没学到,如果靠下学期再来学点东西,以后出去就别想混了 ...…

查看全部问答>

播放器在wince5.0中,无法准确的定位播放位置

先详细解释一下标题的意思。    我的播放器运行在wince5.0中,我编写了各种各样的播放器,有使用WMP的,有使用TCPMP的,有使用用DSHOW的,都会有这么个情况:    我要跳转到视频的某个位置,比如说10s,不能准确的设置到10s,而 ...…

查看全部问答>

wince+S3C2440功耗问题

用核心板做一款机器,最后做电源管理才发现PWREN给悬空了,且VDDi,VDDiarm和VDDalive一起供电,休眠省电基本不用想了,现在我想仅靠降低CLOCK时钟降低功耗,比如进入SLOW模式,能将2440电流降低到多少?哪位试验过? 另外在wince系统运行时候转换n ...…

查看全部问答>

100分 关于一个程序流程的问题

请教各位帮忙单步跟踪一下下面这个程序 #include   \"stdafx.h\"      #include         #include         using   namespace  &n ...…

查看全部问答>

***IPCamera嵌入式开发合作,有意向者请进***

本公司(知名国企)正在寻求IPCamera(网络摄像机)的技术合作,包括嵌入式开发+硬件设计、中心 管理平台开发。有特色的产品,可提供整机、主板,或者能提供优秀的硬件方案的亦可。     合作方式多种,可技术转让、兼职或者全职。 &nb ...…

查看全部问答>

谁有STM单片机的中文汇编资料,请分享一下

                                 在官方网上找到了一个英文的,看的真累,那位大虾翻译一下,分享出来.…

查看全部问答>

USB口防真器程序编译的问题

程序先前一直没问题,后来改程序又加了几条语句,在编译过程中就有一个错误:Code size limit exceeded(4096 code bytes)for this version of the compiler 4212bytes of CODE memory 10bytes of CONST memory(+4bytes shared) 544bytes of DATA me ...…

查看全部问答>