stm32f030 学习笔记 (1)adc单/双通道采集

这篇具有很好参考价值的文章主要介绍了stm32f030 学习笔记 (1)adc单/双通道采集。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

adc双通道采集,stm32,学习,单片机

 1.实现单通道

        如 pa0 pa1 pa2 温度传感器

        1.实现单通道步骤

                1):配置RCC   GPIOA,UART1,ADC1使能

                        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA,ENABLE);
                        RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);

                        RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);

                2):配置GPIO 

                        GPIO_InitTypeDef GPIO_InitStruct={
                                .GPIO_Pin = GPIO_Pin_9 ,//串口发送引脚,方便调试
                                .GPIO_Mode = GPIO_Mode_AF,
                                .GPIO_Speed = GPIO_Speed_Level_3,
                                .GPIO_OType = GPIO_OType_PP,
                                .GPIO_PuPd = GPIO_PuPd_NOPULL,
                            };
                        GPIO_Init(GPIOA,&GPIO_InitStruct);

                        GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_1);//配置9脚位复用

                        GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;//传感器TAM引脚
                        GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AIN;//模拟输入
                        GPIO_InitStruct.GPIO_Speed = GPIO_Speed_Level_3;
                        GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;

                        GPIO_Init(GPIOA,&GPIO_InitStruct);

                3):配置UART1

                        USART_InitTypeDef USART_InitStruct={
                                .USART_BaudRate = 115200,//波特率
                                .USART_WordLength = USART_WordLength_8b,//数据位 8
                                .USART_StopBits = USART_StopBits_1,//停止位 1
                                .USART_Parity = USART_Parity_No,//校验位 无
                                .USART_Mode = USART_Mode_Rx | USART_Mode_Tx,//rx接收,tx发送
                                .USART_HardwareFlowControl = USART_HardwareFlowControl_None,//无流控
                       };
                      USART_Init(USART1,&USART_InitStruct);
                      USART_Cmd(USART1,ENABLE);//使能串口

                4):配置ADC1

                        //adc时钟初始化
                        RCC_ADCCLKConfig(RCC_ADCCLK_PCLK_Div4);

                        //adc1 初始化
                        ADC_InitTypeDef ADC_InitStruct={
                                .ADC_Resolution = ADC_Resolution_12b, //配置数字信号值的分辨率为12位
                                .ADC_ContinuousConvMode = DISABLE, //配置不要进行持续的模数转换  DISABLE   持续转换 ENABLE
                                .ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None, //启用软件触发,禁止外部启用模数转换
                                .ADC_DataAlign = ADC_DataAlign_Right, //右对齐
                                .ADC_ScanDirection = ADC_ScanDirection_Backward, //配置adc扫描方式 向下扫描
                            };
                            ADC_Init(ADC1,&ADC_InitStruct);
                             //校准ADC1
                            ADC_GetCalibrationFactor(ADC1);
                            //使能adc1
                            ADC_Cmd(ADC1,ENABLE);
                            //等待adc1启用
                            while(ADC_GetFlagStatus(ADC1,ADC_FLAG_ADEN) == RESET);
                            //开始校准ADC1 开始转换
                            ADC_StartOfConversion(ADC1);

完整代码:

   串口部分

uart.h
---------------------//分隔符,不要复制
#ifndef __UART_H_
#define __UART_H_

void uart_init(void);
void uart_tx_data(uint16_t a);
void uart_tx_char(char a);
void delay(void);

#endif
--------------------//分隔符,不要复制
uart.c
--------------------//分隔符,不要复制
#include "stm32f0xx.h"                  // Device header
#include "uart.h"

void uart_init()
{
	RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA,ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
		
	GPIO_InitTypeDef GPIO_InitStruct={
		.GPIO_Pin = GPIO_Pin_9 ,//| GPIO_Pin_10,
		.GPIO_Mode = GPIO_Mode_AF,
		.GPIO_Speed = GPIO_Speed_Level_3,
		.GPIO_OType = GPIO_OType_PP,
		.GPIO_PuPd = GPIO_PuPd_NOPULL,
	};
	GPIO_Init(GPIOA,&GPIO_InitStruct);
	
	//GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10;
	//GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN;
	//GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
	//GPIO_Init(GPIOA,&GPIO_InitStruct);
	
	GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_1);
	//GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_1);
	
//UART1_init
	USART_InitTypeDef USART_InitStruct={
		.USART_BaudRate = 115200,
		.USART_WordLength = USART_WordLength_8b,
		.USART_StopBits = USART_StopBits_1,
		.USART_Parity = USART_Parity_No,
		.USART_Mode = USART_Mode_Rx | USART_Mode_Tx,
		.USART_HardwareFlowControl = USART_HardwareFlowControl_None,
	};
	USART_Init(USART1,&USART_InitStruct);
	USART_Cmd(USART1,ENABLE);
}
//延时
void delay()
{
	int i=0x4C4B40;
	while(i--);
}
//串口发送 接收到的ADC采集到的数据
void uart_tx_data(uint16_t a)
{
	USART_SendData(USART1,a);
	while(USART_GetFlagStatus(USART1,USART_FLAG_TC) == RESET);
}
//串口发送一个字符
void uart_tx_char(char a)
{
	USART_SendData(USART1,a);
	while(USART_GetFlagStatus(USART1,USART_FLAG_TC) == RESET);
}
---------------------------//分隔符,不要复制


ADC部分

adc.h
-----------------------------------//分隔符,不要复制
#ifndef __ADC_H_
#define __ADC_H_

void adc_init(void);
uint32_t get_val(uint32_t ADC_Channel);

#endif
-----------------------------------//分隔符,不要复制
adc.h
-----------------------------------//分隔符,不要复制
#include "stm32f0xx.h"                  // Device header
#include "adc.h"

void adc_init(void)
{
	//系统时钟初始化  gpioa adc1
	RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA,ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);
	//adc时钟初始化 
	RCC_ADCCLKConfig(RCC_ADCCLK_PCLK_Div4);
	//gpioa 初始化
	GPIO_InitTypeDef GPIO_InitStruct={
		.GPIO_Pin = GPIO_Pin_0,//| GPIO_Pin_1 | GPIO_Pin_2,
		.GPIO_Mode = GPIO_Mode_AN,
		.GPIO_Speed = GPIO_Speed_Level_3,
		.GPIO_PuPd = GPIO_PuPd_NOPULL,
	};
	GPIO_Init(GPIOA,&GPIO_InitStruct);
	//adc1 初始化
	ADC_InitTypeDef ADC_InitStruct={
		.ADC_Resolution = ADC_Resolution_12b, //配置数字信号值的分辨率为12位
		.ADC_ContinuousConvMode = DISABLE, //配置不要进行持续的模数转换 DISABLE   持续转换 ENABLE 
		.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None, //启用软件触发,禁止外部启用模数转换
		.ADC_DataAlign = ADC_DataAlign_Right, //右对齐
		.ADC_ScanDirection = ADC_ScanDirection_Backward, //配置adc扫描方式 向下扫描
	};
	ADC_Init(ADC1,&ADC_InitStruct);
	//校准ADC1 
	ADC_GetCalibrationFactor(ADC1);
	//启用adc1
	ADC_Cmd(ADC1,ENABLE);
	//等待adc1启用
	while(ADC_GetFlagStatus(ADC1,ADC_FLAG_ADEN) == RESET);
	//开始校准ADC1 开始转换
	ADC_StartOfConversion(ADC1);
}
//采集数据 ADC_Channel 填 ADC_Channel_0
uint32_t get_val(uint32_t ADC_Channel)
{
	//配置adc1的采样时长
	ADC_ChannelConfig(ADC1,ADC_Channel,ADC_SampleTime_239_5Cycles);
	//开启多通道
	ADC1->CHSELR=(uint32_t)ADC_Channel;
	//开始转换
	ADC_StartOfConversion(ADC1);
	//等待转换完成
	while(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC) == RESET);
	//返回转换数据
	return ADC_GetConversionValue(ADC1);
}
-----------------------------------//分隔符,不要复制

主函数

#include "stm32f0xx.h" // Device header
#include "uart.h"
#include "adc.h"
//发送高八位数据
uint16_t get_h_data(uint16_t a)
{
	uint16_t h_data;
	h_data = (a>>8) & (0xff);
	return h_data;
}
//发送低八位数据
uint16_t get_l_data(uint16_t a)
{
	uint16_t l_data;
	l_data = a & (0xff);
	return l_data;
}

int main(void)
{
	uint16_t a;
	uart_init();
	adc_init();
	
	while (1)
	{
		delay();
		//  TAM端
		a = get_val(ADC_Channel_0);
		uart_tx_data(get_h_data(a));
		uart_tx_data(get_l_data(a));
		delay();
	}
}

adc双通道采集,stm32,学习,单片机 

30为 ‘\0’的16进制    01 B3 为采集到的值(16进制) 

        文章来源地址https://www.toymoban.com/news/detail-610085.html

        

到了这里,关于stm32f030 学习笔记 (1)adc单/双通道采集的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于STM32F030、MAX30102血氧心率监测仪的设计(一)

            搞这个设计用时大约一周,中途遇到好多问题,查找资料乱七八糟,始终没有解决问题,只能自己慢慢的啃资料,本文章主要记录设计过程及记录遇到的问题,做个记录同时帮助有需要的朋友。         目前该设计已成功读取计算出血氧及心率数据,算法还需

    2023年04月23日
    浏览(36)
  • STM32 HAL库 PWM+DMA 驱动WS2812B彩灯(STM32F030F4P6)

    博主使用STM32驱动WS2812B主要参考了这位佬的文章,因为需求问题,采用了Cortex-M0的stm32f030f4p6(16k的flash,4k的sram)来驱动,原文中写的是stm32f103c8t6,个人认为其实区别并不是很大,需要修改部分参数即可移植(cv战士申请出战)。 上图是我的一圈灯,一共8个,第一个LED的数

    2024年02月06日
    浏览(53)
  • 使用RT-Thread studio IDE开发stm32F407(实现adc多通道采集)

    注意:使用这个IDE配置工程特别简单( only   10  minutes ) step1:选择对应的芯片或开发板创建RT-Thread项目   step2:配置RT-Thread Settings(按我的步骤顺序进行) 由于要用到ADC,所以我们使能这个框架,直接把它选上就ok 是不是特别简单?接下来第三步,要难一点了 step3 注意: 这

    2024年02月09日
    浏览(38)
  • 航顺HK32F030M怎么样 航顺HK32F030M应用领域介绍

    航顺HK32F030M是一款基于ARM Cortex-M0+内核的32位微控制器,具有高性能、低功耗、经济适用等特点。以下是颖特新关于航顺HK32F030M的详细介绍: 一、性能表现 航顺HK32F030M采用ARM Cortex-M0+内核,主频最高可达64MHz,具有出色的计算能力和数据处理能力。其指令集简洁高效,易于编程

    2024年02月13日
    浏览(38)
  • ESP32学习笔记09-ADC多通道采集 dma方式传输

    9.1.1特点 高性能。时钟更快,因此采样 速率实现了大幅提升 。 支持 多通道扫描 模式。每个 SAR ADC 的测量规则可见 样式表 。扫描模式可配置为 单通道模式 双通道模式 交替模式。 扫描可由软件或 I2S 总线发起。 支持 DMA,扫描完成即发生中断 9.1.2样式表 通道 分辨率 衰减倍

    2023年04月21日
    浏览(36)
  • 【N32L40X】学习笔记11-ADC规则通道采集+dma数据传输

    支持 1 个 ADC,支持单端输入和差分输入,最多可测量 16 个外部和 3 个内部源。 支持 12 位、10 位、8 位、6 位分辨率。 ADC 时钟源分为 工作时钟源、采样时钟源和计时时钟源 仅可配置 AHB_CLK 作为 工作时钟源 。 可配置 PLL 作为 采样时钟源 ,最高可到 64MHz,支持分频 1,2,4,6,8,

    2024年02月15日
    浏览(40)
  • STM32F407 ADC多通道采样+DMA

    我加入工作室参加的第一个比赛是第五届中国高校智能机器人创意大赛,我参加的赛项是开放部件组轮式自主格斗机器人。经历了没日没夜的调试,无数次欣赏凌晨四点半的夜晚,感受着每天就睡两三个小时伴随着疲惫的开心。在我和队友的共同努力之下,我们的成绩也很优

    2024年02月02日
    浏览(48)
  • STM32-单通道ADC采集(DMA读取)实验

    关于ADC的一些原理和实验我们已经有了2篇笔记,链接如下: 关于ADC的笔记1_Mr_rustylake的博客-CSDN博客 STM32-ADC单通道采集实验_Mr_rustylake的博客-CSDN博客 实验要求:通过ADC1通道1(PA1)采集电位器的电压,并显示ADC转换的数字量和换算后的电压值。 我们通过下表可以知道DMA1通道

    2024年02月16日
    浏览(43)
  • STM32-ADC多通道数据采集:理论与实践

    本文详细介绍了STM32-ADC多通道数据采集的理论基础和实践应用。文章首先解释了ADC的基本概念和特性,然后详细阐述了ADC采样的过程和注意事项。接着,文章深入讲解了多通道采集模式的轮询和DMA两种方法,并给出了具体的代码实现。

    2024年02月10日
    浏览(38)
  • STM32-微项目10-ADC多通道采集+DMA数据转移

    一、微项目实现目标: 由于ADC多通道采集在规则组中只有一个寄存器CR,实际上在多通道采集时刻,需要把每一个同都的数据及时传出,否则上一个通道的数据会被当前通道的数据给覆盖掉。 二、微项目硬件配置需求:  stm32F103C8T6核心板一块 0.96寸OLED显示,用于显示计数 三

    2024年02月16日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包