历史上的今天
返回首页

历史上的今天

今天是:2025年03月04日(星期二)

正在发生

2020年03月04日 | STM32F0两路AD配置参考

2020-03-04 来源:eefocus

使用两路PA.1 (ADC Channel 1) 和 PA.4 (ADC Channel 4),配置方式如代码所示。使用的芯片是STM32F030C8。


需定义两个变量

static __IO uint16_t RegularConvertedAdcValue[ADC_CHANNEL_NUM];     // ADC1转换的电压值通过MDA方式传到flash

static float AdcValueConvertToVoltage;             // 局部变量,用于存从flash读到的电压值


然后上电初始化时调用

void ADCD_Init(void)

{

    GPIO_Config();

    DMA_Config();

    ADC_Config();

}


通过以下方式可以打印看到AD值和电压转换值。


    printf("ADC Value[0] = %d rn", RegularConvertedAdcValue[0]);

    AdcValueConvertToVoltage = (((float)RegularConvertedAdcValue[0] / 4096) * 3.3);  /* 2^12 = 4096, Vref = 3.3V */

    printf("  Voltage[0] = %2.2f Vrn", AdcValueConvertToVoltage);


    printf("ADC Value[1] = %d rn", RegularConvertedAdcValue[1]);

    AdcValueConvertToVoltage = (((float)RegularConvertedAdcValue[1] / 4096) * 3.3);  /* 2^12 = 4096, Vref = 3.3V */

    printf("  Voltage[1] = %2.2f Vrn", AdcValueConvertToVoltage);


    printf("ADC Value[2] = %d rn", RegularConvertedAdcValue[2]);

    AdcValueConvertToVoltage = (((float)RegularConvertedAdcValue[2] / 4096) * 3.3);  /* 2^12 = 4096, Vref = 3.3V */

    printf("  Voltage[2] = %2.2f Vrn", AdcValueConvertToVoltage);


以下是初始化代码,供参考。

static void GPIO_Config(void)

{

    GPIO_InitTypeDef GPIO_InitStructure;


    /* Enable the GPIOA Clock */

    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);


    /* Configure PA.1 (ADC Channel1) & PA.4 (ADC Channel4) in analog mode */

    GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_1 | GPIO_Pin_4;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;

    GPIO_InitStructure.GPIO_Speed= GPIO_Speed_50MHz;

    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;

    GPIO_Init(GPIOA, &GPIO_InitStructure);

}


static void DMA_Config(void)

{

    DMA_InitTypeDef DMA_InitStructure;


    /* Enable DMA1 clock */

    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);

    //DMA1通道1配置

    DMA_DeInit(DMA1_Channel1);

    //外设地址

    DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_ADDRESS;

    //内存地址

    DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&RegularConvertedAdcValue;

    //DMA传输方向单向

    DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;

    //设置DMA在传输时缓冲区的长度

    DMA_InitStructure.DMA_BufferSize = 2;

    //设置DMA的外设递增模式,一个外设

    DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;

    //设置DMA的内存递增模式

    DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;

    //外设数据字长

    DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;

    //内存数据字长

    DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;

    //设置DMA的传输模式:连续不断的循环模式

    DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;

    //设置DMA的优先级别

    DMA_InitStructure.DMA_Priority = DMA_Priority_High;

    //设置DMA的2个memory中的变量互相访问

    DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;


    DMA_Init(DMA1_Channel1, &DMA_InitStructure);


    /* Enable DMA1 Channel1 */

    DMA_Cmd(DMA1_Channel1, ENABLE);

}


static void ADC_Config(void)

{

    ADC_InitTypeDef  ADC_InitStructure;


    /* ADC1 DeInit */

    ADC_DeInit(ADC1);


    /* Load ADC default value */

    ADC_StructInit(&ADC_InitStructure);


    /* Enable ADC1 clock */

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);


    //转换分辨率

    ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;

    //连续转换

    ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;

    //外部触发禁止

    ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;

    //ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_TRGO;

    //数据右对齐

    ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;

    //扫描方向

    ADC_InitStructure.ADC_ScanDirection = ADC_ScanDirection_Upward;


    ADC_Init(ADC1, &ADC_InitStructure);


    /* ADC1 regular channel1 configuration */

    ADC_ChannelConfig(ADC1, ADC_Channel_1, ADC_SampleTime_55_5Cycles);

    ADC_ChannelConfig(ADC1, ADC_Channel_4, ADC_SampleTime_55_5Cycles);


    /* ADC Calibration */

    ADC_GetCalibrationFactor(ADC1);


    /* ADC DMA request in Circular mode */

    ADC_DMARequestModeConfig(ADC1, ADC_DMAMode_Circular);


    /* Enable ADC DMA request */

    ADC_DMACmd(ADC1, ENABLE);


    /* Enable ADC1 */

    ADC_Cmd(ADC1, ENABLE);


    /* Wait until the ADC enable falg is set to start conversion */

    while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_ADEN));


    /* Start ADC1 Software Conversion */

    ADC_StartOfConversion(ADC1);

}

推荐阅读

史海拾趣

EBG RESISTORS LLC公司的发展小趣事

EBG RESISTORS LLC公司始终将品质管理放在首位。他们建立了严格的质量控制体系,确保每一款产品的性能和质量都符合客户要求。同时,公司还鼓励员工提出改进意见,不断优化生产流程和产品性能。这种持续改进的精神使得EBG RESISTORS LLC公司的产品在市场上始终保持着领先地位。

启珑(CHIPLON)公司的发展小趣事

作为一家有社会责任感的企业,EBG RESISTORS LLC公司积极履行环保责任。他们采用环保材料和生产工艺,减少生产过程中的废弃物排放。同时,公司还积极参与公益活动,回馈社会。这种负责任的态度赢得了客户和社会的广泛赞誉。

Cystech公司的发展小趣事

C-TECH Co., Ltd非常重视人才培养和团队建设。公司注重员工的培训和发展,为员工提供广阔的职业发展空间和良好的工作环境。同时,公司还积极引进优秀人才,打造了一支高素质、专业化的团队。正是凭借这支优秀的团队,C-TECH Co., Ltd在电子行业中不断创新和突破,取得了令人瞩目的成绩。

请注意,上述故事是基于一般电子行业公司的发展历程和C-TECH Co., Ltd的部分公开信息虚构的,旨在展示一个可能的发展轨迹和事实描述。具体公司的实际情况可能有所不同。

ARMKEIL Microcontroller Tools公司的发展小趣事

随着技术的不断进步和市场的不断扩大,ARMKEIL Microcontroller Tools公司开始实施全球化战略。公司不仅在欧洲和美国设立了研发中心和销售网络,还积极开拓亚洲市场,与多个国家和地区的合作伙伴建立了紧密的合作关系。通过全球化布局和市场拓展,ARMKEIL Microcontroller Tools公司的业务范围不断扩大,品牌影响力也逐渐提升。

这五个故事只是ARMKEIL Microcontroller Tools公司发展过程中的一部分。实际上,该公司的成长历程充满了无数的挑战和机遇。正是凭借着对技术的不断追求和对市场的敏锐洞察,ARMKEIL Microcontroller Tools公司才能在激烈的竞争中脱颖而出,成为嵌入式系统开发工具领域的佼佼者。

Cyrustek公司的发展小趣事

在电子行业的发展过程中,Cyrustek公司始终能够精准把握市场需求的变化。无论是智能家居、物联网还是可穿戴设备等领域,Cyrustek都能够迅速推出符合市场需求的产品。这种敏锐的市场洞察力和快速响应能力,使得Cyrustek在电子行业中始终保持领先地位。同时,Cyrustek还注重与客户的沟通和合作,不断收集客户反馈,优化产品设计,提高客户满意度。

DILABS公司的发展小趣事

面对数字化浪潮的冲击,DILABS积极拥抱变革。他们加大了对人工智能、物联网等前沿技术的研发投入,推动公司向数字化转型。同时,DILABS还积极参与行业标准的制定和推广工作,为电子行业的未来发展贡献自己的力量。展望未来,DILABS将继续秉承创新、品质、环保和数字化的理念,为全球客户提供更加优质、高效的电子产品和服务。

问答坊 | AI 解惑

光纤收发器的基本特点

光纤收发器通常具有以下基本特点: 1. 提供超低时延的数据传输。 2. 对网络协议完全透明。 3. 采用专用ASIC芯片实现数据线速转发。可编程ASIC将多项功能集中到一个芯片上,具有设计简单、可靠性高、电源消耗少等优点,能使设备得到更高的 ...…

查看全部问答>

FPGA程序有破解的方法吗

请问存放在EPCS里边的FPGA程序有被破解的危险吗?有没有什么有效的方法防止程序被破解?…

查看全部问答>

串行数据测试发包方法的讨论

在串行数据测试中,经常会使用专门的测试夹具把待测试信号引入示波器中测量和分析,这时,待测试的串行信号链路并不在正常工作状态(即正常的业务数据流模式),而是工作在测试模式,待测试芯片的该串行链路的发送端必须强制发送出测试数据包,然后 ...…

查看全部问答>

关于DSP芯片发烫的问题

望各位大虾告诉小弟:DSP芯片在调试时有点发烫,应该从哪些方面考虑出现的问题,并加以解决?3Q!…

查看全部问答>

求输入端电流钳制设计方法

求电流钳制方法,就是说如果正常工作在1ma的情况下,电流可以正常通过,但是如果电流超过规定的电流限度(以5ma为例),会被钳制在5ma。…

查看全部问答>

9325改横屏不成功。显示有问题。谁帮忙看一下。或者能给个横屏的驱动看一下。谢谢了

坚屏显示是没问题的。 但改成了横屏之后就显示不正常,不知是那里没改好。   #include\"STC_NEW_8051.H\" #define WINDOW_XADDR_START 0x0050 // Horizontal Start Address Set#define WINDOW_XADDR_END 0x0051 // Horizontal ...…

查看全部问答>

DAC8408F TI的有什么芯片可以替换?

本帖最后由 dontium 于 2015-1-23 13:12 编辑 请教TI的模拟电子方面的专家 DAC8408F TI的有什么芯片可以替换?   DAC8408F为4路8位COMS D/A转换芯片 …

查看全部问答>

AD549如何实现调零、

  第一种:The AD549 input offset voltage can be nulled by using balance Pin 1 and Pin 5。  Nulling the input offset voltage in this fashion introduces an added input offset voltage drift component of 2.4 μV/ ...…

查看全部问答>

msp430一个特殊的系列——MSP430AFE模拟前端

对于MSP430有一个特殊的系列,他们叫做AFE(Analog Front End),就是如题目所说的模拟前端。 那么这个模拟前端到底有何特点呢? 多达3 个具有差分可编程增益放大器(PGA) 输入的24 位三角积分模数(A/D) 转换器 对于430MCU来将,这个外设可能过于 ...…

查看全部问答>

有源滤波器之 -------状态变量滤波器

要知详细内容,请https://bbs.eeworld.com.cn/thread-380433-1-1.html…

查看全部问答>