【stm32/CubeMX、HAL库】swjtu嵌入式实验七 ADC 实验

相关电路与IO引脚

注意:串口打印重定向后使用printf打印需要在keil里勾选 Use MicroLIB ,否则会卡住。 

参看:https://zhuanlan.zhihu.com/p/565613666

串口重定向:

/* USER CODE BEGIN Includes */
 
#include <stdio.h>// 包含标准输入输出头文件
 

/* USER CODE END Includes */


int fputc(int ch,FILE *f)
 
{
 
//采用轮询方式发送1字节数据,超时时间设置为无限等待
 
HAL_UART_Transmit(&huart1,(uint8_t *)&ch,1,HAL_MAX_DELAY);
 
return ch;
 
}

int fgetc(FILE *f)
 
{
 
uint8_t ch=0;
 
// 采用轮询方式接收 1字节数据,超时时间设置为无限等待
 
HAL_UART_Receive( &huart1,(uint8_t*)&ch,1, HAL_MAX_DELAY );
 
return ch;
 
}

ADC的GPIO复用引脚表:

 参考:

视频教程:14.1和14.2节

【【14.1】STM32 ADC模数转换器 感知世界的钥匙——Kevin带你读《STM32Cube高效开发教程基础篇》】 https://www.bilibili.com/video/BV1CV4y1k71M/?share_source=copy_web&vd_source=9332b8fc5ea8d349a54c3989f6189fd3

博客:

https://blog.csdn.net/little_grapes/article/details/121154513

ADC相关函数:

 实验内容

1、利用 ADC1 通道 3 采样 PA3 的电压值,将 ADC 采样值和转换的电压值通过串行口返回, 调节电位器,观察运行结果。

根据前面的复用引脚表,选择ADC1的通道IN3。

CubeMX配置如下,

采样时间(sampling time)选择55.5cycles,采样时间长一些结果更准确。

因为也要使用中断方式,所以要开启中断

 

轮询方式:

  /* USER CODE BEGIN 2 */
   HAL_ADCEx_Calibration_Start(&hadc1);
  
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
		
		//轮询
		HAL_ADC_Start(&hadc1);
		HAL_ADC_PollForConversion(&hadc1,50);//is it finished?
		if(HAL_IS_BIT_SET(HAL_ADC_GetState(&hadc1),HAL_ADC_STATE_REG_EOC))
		{
		adc_res=HAL_ADC_GetValue(&hadc1);
			printf("voltage value:%.1f V\r\n",adc_res*3.3/4095);
		}
		//延时一段时间再启动转换
		HAL_Delay(1000);
		
  }
  /* USER CODE END 3 */

 中断方式(直接把轮询相关的代码替换,详见参考的文章)

  /* USER CODE BEGIN 2 */
	
	//中断方式启动ADC转换
  HAL_ADC_Start_IT(&hadc1);
	
  /* USER CODE END 2 */

 回调函数:

void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
{
  if(hadc->Instance==ADC1){
	adc_res=HAL_ADC_GetValue(&hadc1);
		printf("voltage value:%.2f V,original value:%d \r\n",adc_res*3.3/4095,adc_res);
	
	}
}

2、编写程序,利用光敏电阻设计光电开关,控制 LED1 点亮和熄灭。

光敏电阻对应引脚PA2,选择ADC1的IN2通道,选择使用定时器作为中断源,注意此时要关闭连续转换,cubemx配置:

记得开启ADC中断。

然后配置定时器,这里用定时器3,频率为72mhz/(7200*5000)

 

 代码:

  /* USER CODE BEGIN 2 */

//中断方式启动ADC转换
  HAL_ADC_Start_IT(&hadc1);
	//开启定时器3
	HAL_TIM_Base_Start(&htim3);

  /* USER CODE END 2 */

 回调函数(这里设置设置计算电压的方法也是按照3.3V作为参考电压,大于2.1V就点亮灯(这里点亮了两个灯),灯的引脚看前面的GPIO实验)

void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
{
  if(hadc->Instance==ADC1){
	adc_res=HAL_ADC_GetValue(&hadc1);
	//	printf("voltage value:%.1f V\r\n",adc_res*3.3/4095);
	  if(adc_res*3.3/4095>2.1){
		HAL_GPIO_WritePin(GPIOB,GPIO_PIN_13,0);
		HAL_GPIO_WritePin(GPIOF,GPIO_PIN_0,1);
			
		}	else{
		
		HAL_GPIO_WritePin(GPIOB,GPIO_PIN_13,1);
			
			HAL_GPIO_WritePin(GPIOF,GPIO_PIN_0,0);
		}
	
	}
}

3、设计一个室内温控系统,PA3 采样电压表示采集的温度,阈值上限为 2.5V,下限为 1V,采样电压显示在数码管上。

(1)当采样电压低于 1V(温度过低),蜂鸣器鸣叫(模拟声音报警),LED1 闪烁(模 拟光报警),全彩灯打开(模拟加热)。

(2)当采样电压位于 1V~2.5V 时,正常,蜂鸣器不叫,发光二极管不亮,电机不转。

(3)当采样电压高于 2.5V 时(温度过高),蜂鸣器鸣叫(模拟声音报警),LED1 闪烁 (模拟光报警),电机旋转(模拟风扇降温)。

这里蜂鸣器(PB8)用定时器4通道3输出一定频率的PWM控制,led闪烁间隔时间用cnt控制,循环了一定次数才翻转电平。配置如下:

段码表10以后是原来的数字加上了小数点显示 

/* USER CODE BEGIN 0 */

uint8_t flag=0;
 int res=0;
//uint8_t table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x80 };//10表示'-'
uint8_t table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x80+0x3f,0x80+0x06,0x80+0x5b,0x80+0x4f,0x80+0x66,0x80+0x6d,0x80+0x7d,0x80+0x07,
0x80+0x7f,0x80+0x6f, };//10表示'-'
uint8_t s[]={0,0,0,0,0,0,10,0};
uint16_t adc_res=0;
int light_flag=0;
			uint8_t n1;
			uint8_t n2;

void write_byte(uint8_t date){
    unsigned char i;
	for(i=0;i<8;i++){
	  HAL_GPIO_WritePin(GPIOA,GPIO_PIN_7,(date>>(7-i))&0x01);
		HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,1);
		HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,0);
	}
	HAL_GPIO_WritePin(GPIOA,GPIO_PIN_8,1);
	HAL_GPIO_WritePin(GPIOA,GPIO_PIN_8,0);
 
}




int fputc(int ch,FILE *f)
 
{
 
//采用轮询方式发鿿1字节数据,超时时间设置为无限等待
 
HAL_UART_Transmit(&huart1,(uint8_t *)&ch,1,HAL_MAX_DELAY);
 
return ch;
 
}

int fgetc(FILE *f)
 
{
 
uint8_t ch=0;
 
// 采用轮询方式接收 1字节数据,超时时间设置为无限等待
 
HAL_UART_Receive( &huart1,(uint8_t*)&ch,1, HAL_MAX_DELAY );
 
return ch;
 
}

void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
{
  if(hadc->Instance==ADC1){
	adc_res=HAL_ADC_GetValue(&hadc1);
   float vol=adc_res*3.3/4095;
		printf("voltage value:%.2f V\r\n",vol);
	  if(vol <1){
		HAL_GPIO_WritePin(GPIOB,GPIO_PIN_13,0);

			light_flag=1;
			 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_12, 0);
        HAL_GPIO_WritePin(GPIOD, GPIO_PIN_13, 0);
			HAL_TIM_PWM_Start(&htim4,TIM_CHANNEL_3);
			
		}	else if(adc_res*3.3/4095 >=1 &&adc_res*3.3/4095<=2.5){
		
		HAL_GPIO_WritePin(GPIOB,GPIO_PIN_13,1);
			 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_12, 0);
        HAL_GPIO_WritePin(GPIOD, GPIO_PIN_13, 0);
			HAL_TIM_PWM_Stop(&htim4,TIM_CHANNEL_3);

			light_flag=0;
		}else{
		light_flag=1;
        HAL_GPIO_WritePin(GPIOD, GPIO_PIN_12, 1);
        HAL_GPIO_WritePin(GPIOD, GPIO_PIN_13, 0);
			
			HAL_TIM_PWM_Start(&htim4,TIM_CHANNEL_3);       
		}
		
		n1=(uint8_t)vol;
		n2=(uint8_t)(vol*10)%10;
		
		//printf(" value:%d V\r\n",n1);
		//printf(" value:%d V\r\n",n2);
	
	}
}

  int cnt=0;
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
		if(light_flag==1){
			cnt++;
			if(cnt==50){
			cnt=0;
			HAL_GPIO_TogglePin(GPIOF,GPIO_PIN_0);
			}
		  
		}else{
			HAL_GPIO_WritePin(GPIOF,GPIO_PIN_0,0);
			cnt=0;
		}
		
		s[7]=n2;
		s[6]=n1+10;
		
		
		for(int i=8;i<11;i++){
		write_byte(table[s[15-i]]);
		HAL_GPIO_WritePin(GPIOF,0x01<<i,0);
		HAL_Delay(1);
		HAL_GPIO_WritePin(GPIOF,0x01<<i,1);
		}
		
		
  }
  /* USER CODE END 3 */

源文件见个人主页。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/685378.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

利用opencv-python实现图像全景拼接技术实现

这个代码的主要功能是将多张图像拼接成一张全景图。它使用了OpenCV库中的SIFT特征提取、特征匹配和图像变换等技术来实现图像拼接。 一、预览效果 二、安装依赖 contourpy1.2.1 cycler0.12.1 fonttools4.53.0 importlib_resources6.4.0 kiwisolver1.4.5 matplotlib3.9.0 numpy…

保姆级讲解 FTP服务器的配置与管理

本来目录很长的 因为感觉不太美观 所以小标题都删掉了 本文介绍了 本地用户的FTP服务器搭建实例匿名用户的FTP服务器搭建实例虚拟用户的FTP服务器搭建实例企业常见类型搭建实验 配置与管理FTP服务器 配置与管理FTP服务器一、FTP相关知识二、项目设计与准备三、项目实施四、认识…

大语言模型 (LLM) 窥探未来

随着2023年的岁月渐渐走向尾声&#xff0c;我们站在人工智能的前沿&#xff0c;回望大语言模型&#xff08;Large Language Models, LLM&#xff09;所走过的道路&#xff0c;同时也不禁展望未来。从初步尝试到成为人工智能领域的万千宠爱&#xff0c;一种又一种的技术突破&…

Facechain系列: constants.py文件解读

在根目录下还有个facechain目录&#xff0c;其中的constants.py文件中定义了代码控制的重要参数。 1.姿态控制 在应用代码进行推理&#xff08;见这里Facechain系列: 通过代码进行推理&#xff09;中&#xff0c;如果将以下代码 use_pose_model False 修改为 use_pose_mo…

Spring boot 集成mybatis-plus

Spring boot 集成mybatis-plus 背景 Spring boot集成mybatis后&#xff0c;我们可以使用mybatis来操作数据。然后&#xff0c;我们还是需要写许多重复的代码和sql语句&#xff0c;比如增删改查。这时候&#xff0c;我们就可以使用 mybatis-plus了&#xff0c;它可以极大解放我…

docker镜像深入理解

大家好&#xff0c;本篇文章和大家聊下docker相关的话题~~ 工作中经常有关于docker镜像的问题&#xff0c;让人百思不解 docker镜像加载到系统中到哪里去了&#xff1f;docker load 加载镜像的流程是怎样的&#xff1f;为什么容器修改内容后&#xff0c;删除容器后再次开启容…

微信小程序毕业设计-民大食堂用餐综合服务平台系统项目开发实战(附源码+论文)

大家好&#xff01;我是程序猿老A&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;微信小程序毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计…

CentOS6系统因目录有隐含i权限属性致下属文件无法删除的故障一例

CentOS6服务器在升级openssh时因系统目录权限异常&#xff08;有隐含i权限属性&#xff09;&#xff0c;下属文件无法删除&#xff0c;导致系统问题的故障一例。 一、问题现象 CentOS6在升级openssh时&#xff0c;提示如下问题&#xff1a; warning: /etc/ssh/sshd_config c…

java小游戏-坦克大战1.0

文章目录 游戏界面样式游戏需求分析设计类过程1&#xff1a;初始化界面过程2&#xff1a;用面向对象思想设置功能过程3&#xff1a;调用类实例化对象过程4&#xff1a;联合调试 项目代码下载&#xff1a; CSDN_java小游戏-坦克大战1.0 来源&#xff1a;该游戏来自尚学堂~&…

5.23.3 乳腺癌成像中的深度学习:十年的进展和未来方向

乳腺影像学在早期诊断和干预以改善乳腺癌患者的预后方面发挥着重要作用。在过去的十年中,深度学习在乳腺癌成像分析方面取得了显着进展,在解释乳腺成像模式的丰富信息和复杂背景方面具有巨大前景。 基于深度学习的乳腺癌成像研究涵盖了对乳房X光检查、超声、磁共振成像和数字…

新奇css模板

引言 (csscoco.com)https://csscoco.com/inspiration/#/./init 可视化集合 (hepengwei.cn)http://hepengwei.cn/#/html/visualDesign 30 秒代码 (30secondsofcode.org)https://www.30secondsofcode.org/ Animate.css |CSS动画的跨浏览器库。https://animate.style/

探索StartAI:创成式填充与AI绘画的革新

在人工智能的浪潮中&#xff0c;StartAI以其独特的创成式填充和AI绘画功能&#xff0c;成为创意产业的新星。这款产品不仅为艺术家和设计师提供了一个全新的创作平台&#xff0c;也为普通用户提供了探索和表达自我的途径。 创成式填充&#xff1a;【AI扩图】智能艺术的起点 S…

[网鼎杯 2020 青龙组]singal

记录下angr初使用 这道题是很简单的逻辑 32位 我们提取opcode (你可以用convert) 我是用的IDApython\ import idc adr0x00403040 step4#距离 op[] n10#多少个数据 while(n):op.append(hex(idc.get_wide_dword(adr)))adrstepn-1 print(op)然后我又下断点,提取每个"i&q…

Polar Web【简单】uploader

Polar Web【简单】uploader Contents Polar Web【简单】uploader思路EXP运行&总结 思路 本题的重点仍是文件上传&#xff0c;只是期间需要加上一步自主的文件上传。 打开环境&#xff0c;审查代码&#xff0c;发现在上传文件之后会自动生成一个以MD5散列值命名的目录&#…

我的名字叫大数据: 第7章 我的自拍展

7.1 生活瞬间:通过数据图像呈现 数据健身达人们!在经过一系列的辛勤锻炼后,是时候来看看我的“自拍展”了。通过数据图像,我们不仅可以更直观地了解数据,还能将复杂的信息以简单而美观的方式呈现出来。在这一节中,我将带你领略各种数据图像的魅力,从色彩缤纷的条形图到…

在 SEO 中,一个好的网页必须具备哪些 HTML 标签和属性?

搜索引擎优化 &#xff08;SEO&#xff09; 是涉及提高网站在搜索引擎上的可见性的过程。这是通过提高网站在搜索引擎结果页面&#xff08;例如Google&#xff09;上的排名来实现的。网站在这些页面上的显示位置越高&#xff0c;就越有可能获得更大的流量。 搜索引擎优化涉及了…

Linux高级进阶-ssh配置

Ubuntu-system 允许使用root远程登陆 apt install ssh -y在/etc/ssh/sshd_config 文件修改PermitRootLogin yes systemctl restart ssh远程连接软件用户名为root

c++--priority_queue和仿函数

目录 1.priority_queue 实现&#xff1a; 2.仿函数 priority_queue仿函数 实现代码 1.priority_queue 优先队列是一种容器适配器&#xff0c;根据严格的弱排序标准&#xff0c;它的第一个元素总是它所包含的元素中最大的&#xff0c;其实就是个堆&#xff0c;默认是大根堆。…

查看服务器端口是否打开,如何查看服务器端口是否打开

查看服务器端口是否打开&#xff0c;是确保服务器正常运行和网络通信畅通的关键步骤。以下是几个有力的方法&#xff0c;帮助你快速、准确地判断端口状态。 首先&#xff0c;你可以使用telnet命令来检测端口的连通性。telnet是一个网络协议&#xff0c;可以用于远程登录和管理网…

O2O:Offline–Online Actor–Critic

IEEE TAI 2024 paper 加权TD3_BC Method 离线阶段&#xff0c;算法基于TD3_BC&#xff0c;同时加上基于Q函数的权重函数&#xff0c;一定程度上避免了过估计 J o f f l i n e ( θ ) E ( s , a ) ∼ B [ ζ Q ϕ ( s , π θ ( s ) ) ] − ∥ π θ ( s ) − a ∥ 2 \begin…