STM32G474之模拟比较器

news2024/11/15 10:36:27

STM32G474之模拟比较器测试方法:
PA1的附加功能为COMP1_INP,无需映射,直接将它配置为模拟功能,然后将COMP1_OUT引脚映射到PA0,采用DAC1_OUT1输出电压给比较器同向输入COMP1_INP引脚,因此在测试时,需要将PA4和PA1短接。将CPU内部参考电压连接到比较器反向输入端。当DAC1_OUT1输出电压大于“内部Vref/2”时,开灯;当DAC1_OUT1输出电压小于或等于“内部Vref/2”时,关灯。
由于CPU内部参考电压为1.2V,为了实现方波输出,我们限制DAC的最大值为2978,这样DAC的最大电压为2978*3.3/4096=2.4V。

STM32G474有3个DAC通道是带缓冲的外部通道: 
PA4的附加功能为DAC1_OUT1,无需映射,直接将它配置为模拟功能,就可以使用了。
PA5的附加功能为DAC1_OUT2,无需映射,直接将它配置为模拟功能,就可以使用了。
PA6的附加功能为DAC2_OUT1,无需映射,直接将它配置为模拟功能,就可以使用了。

1、比较器框图

2、测试程序

COMP_HandleTypeDef hcomp1;
DAC_HandleTypeDef      DAC_1_Handler;
//DAC1句柄,若直接对寄存器DAC1->DHR12R1和DAC1->DHR12R2操作,就可以将其设置为局部变量

void COMP_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStruct = {0};

    __HAL_RCC_SYSCFG_CLK_ENABLE();
    //RCC_APB2ENR寄存器bit0(SYSCFGEN),SYSCFGEN=1,使能SYSCFG + COMP + VREFBUF + OPAMP时钟
    __HAL_RCC_PWR_CLK_ENABLE();
    //RCC_APB1ENR1寄存器bit28(PWREN),PWREN=1,启用电源接口时钟
    __HAL_RCC_GPIOA_CLK_ENABLE();//开启GPIOA时钟

    GPIO_InitStruct.Pin = GPIO_PIN_1;            //选择引脚编号为1
    GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;     //模拟模式
    GPIO_InitStruct.Pull = GPIO_NOPULL;          //引脚上拉和下拉都没有被激活
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; //输出速度设置为5MHz
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
    //根据GPIO_InitStruct结构变量指定的参数初始化GPIOA的外设寄存器
    //配置“比较器同向输入引脚”

    GPIO_InitStruct.Pin = GPIO_PIN_0;            //选择引脚编号为0
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;      //复用推挽模式
    GPIO_InitStruct.Pull = GPIO_NOPULL;          //引脚上拉和下拉都没有被激活
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; //输出速度设置为5MHz
    GPIO_InitStruct.Alternate = GPIO_AF8_COMP1;  //PA0映射到COMP1_OUT
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
    //根据GPIO_InitStruct结构变量指定的参数初始化GPIOA的外设寄存器
    //配置“比较器输出引脚”

  hcomp1.Instance = COMP1;
  hcomp1.Init.InputPlus = COMP_INPUT_PLUS_IO1;
    //配置“比较器同向输入信号Vin+”来自PA1引脚
  hcomp1.Init.InputMinus = COMP_INPUT_MINUS_VREFINT;
    //配置“比较器反向输入信号Vin-”来自“CPU内部参考电压为1.2V”
  hcomp1.Init.OutputPol = COMP_OUTPUTPOL_NONINVERTED;
    //配置比较器输出极性:当“Vin+ > Vin-”,则输出高电平
  hcomp1.Init.Hysteresis = COMP_HYSTERESIS_40MV;
  hcomp1.Init.BlankingSrce = COMP_BLANKINGSRC_NONE;
  hcomp1.Init.TriggerMode = COMP_TRIGGERMODE_NONE;
  HAL_COMP_Init(&hcomp1);

    __HAL_COMP_ENABLE(&hcomp1);//使能比较器
    HAL_COMP_Start(&hcomp1);//启动COMP1,Start COMP1

    DAC1_Init();
}

void DAC1_Init(void)
{
    DAC_ChannelConfTypeDef DAC1_CH1;        //DAC通道参数相关结构体
    GPIO_InitTypeDef       GPIO_InitStruct; //IO口参数结构体

    __HAL_RCC_DAC1_CLK_ENABLE();  //使能DAC1时钟
    __HAL_RCC_GPIOA_CLK_ENABLE(); //开启GPIOA时钟

    GPIO_InitStruct.Pin   = GPIO_PIN_4;           //选择引脚编号为4
    GPIO_InitStruct.Mode  = GPIO_MODE_ANALOG;     //模拟模式
  GPIO_InitStruct.Pull  = GPIO_NOPULL;          //引脚上拉和下拉都没有被激活
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; //输出速度设置为25MHz至50MHz
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
    //根据GPIO_InitStruct结构变量指定的参数初始化GPIOA的外设寄存器

    DAC_1_Handler.Instance = DAC1; //DAC1
    HAL_DAC_Init(&DAC_1_Handler);  //初始化DAC

    DAC1_CH1.DAC_HighFrequency     = DAC_HIGH_FREQUENCY_INTERFACE_MODE_ABOVE_160MHZ;
    //DAC时钟选择
  DAC1_CH1.DAC_DMADoubleDataMode = DISABLE; //双重数据模式(高带宽模式)关闭
  DAC1_CH1.DAC_SignedFormat      = DISABLE; //有符号模式关闭
  DAC1_CH1.DAC_SampleAndHold     = DAC_SAMPLEANDHOLD_DISABLE; //关闭采样保持
  DAC1_CH1.DAC_Trigger           = DAC_TRIGGER_NONE;          //不需要外部触发
  DAC1_CH1.DAC_OutputBuffer      = DAC_OUTPUTBUFFER_ENABLE;   //DAC输出缓冲器打开
  DAC1_CH1.DAC_UserTrimming      = DAC_TRIMMING_FACTORY;      //工厂矫正模式
    DAC1_CH1.DAC_ConnectOnChipPeripheral = DAC_CHIPCONNECT_DISABLE;    //不允许内部连接DAC1_CH1
  HAL_DAC_ConfigChannel(&DAC_1_Handler, &DAC1_CH1, DAC_CHANNEL_1);   //初始化
  HAL_DACEx_SelfCalibrate(&DAC_1_Handler, &DAC1_CH1, DAC_CHANNEL_1); //矫正
    HAL_DAC_Start(&DAC_1_Handler,DAC_CHANNEL_1); //开启DAC通道1                  
    
//    HAL_DAC_SetValue(&DAC_1_Handler,DAC_CHANNEL_1,DAC_ALIGN_12B_R,2048);
    //设置DAC输出电压: 2048*3.3/(0xFFF+1)=1.65V

    DAC1->DHR12R1=2048;
    //使用寄存器器,直接设置DAC输出电压: 2048*3.3/(0xFFF+1)=1.65V
}

void Test_COMP(void)
{
    uint32_t dac_steps = 0UL;
    uint32_t dac_Value;

  while (1)
    {
        dac_Value=dac_steps*DAC_SAWTOOTH_STEPINC;
        printf("dac_Value=0x%X\r\n",dac_Value);
        HAL_DAC_SetValue(&DAC_1_Handler, DAC_CHANNEL_1,DAC_ALIGN_12B_R,dac_Value );
        dac_steps++;
    if (dac_steps > DAC_SAWTOOTH_STEPS){ dac_steps = 0; }
        HAL_Delay(2);//延时2ms
        if (HAL_COMP_GetOutputLevel(&hcomp1) == COMP_OUTPUT_LEVEL_HIGH)
    {
      LED1_On();
    }
    else
    {
      LED1_Off();
    }
    }
}
 

COMP.h程序;

#ifndef __COMP_H__
#define __COMP_H__

#include "stm32g4xx_hal.h"
//使能int8_t,int16_t,int32_t,int64_t
//使能uint8_t,uint16_t,uint32_t,uint64_t

//CPU内部参考电压为1.2V,为了实现方波输出,所以要限制DAC的最大值为2978,DAC的最大电压为2978*3.3/4096=2.4V
#define DAC_VALUE_MAX         ((uint32_t) 2978)  //DAC的最大电压为2978*3.3/4096=2.4V
#define DAC_SAWTOOTH_STEPS    ((uint32_t) 20)    //DAC的总步数
#define DAC_SAWTOOTH_STEPINC  ((uint32_t) DAC_VALUE_MAX/DAC_SAWTOOTH_STEPS)
//DAC每走1步的增量值

extern void COMP_Init(void);
extern void Test_COMP(void);
#endif /*__ GPIO_H__ */

3、测试结果

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【python】—— Python爬虫实战:爬取珠海市2011-2023年天气数据并保存为CSV文件

目录 目标 准备工作 爬取数据的开始时间和结束时间 爬取数据并解析 将数据转换为DataFrame并保存为CSV文件 本文将介绍如何使用Python编写一个简单的爬虫程序,以爬取珠海市2011年至2023年的天气数据,并将这些数据保存为CSV文件。我们将涉及到以下知识点: 使用r…

UnityShader自定义属性特性

前言: 在编写UnityShader时,我们常常会使用特性来更换材质球面板的属性外观,除此之外,还可以使用自定义的扩展脚本来实现自定义的材质球界面,参考我之前的文章UnityShaderUI编辑器扩展 但是自定义扩展每次都要单独写…

JavaScript接下来的小项目

前言 ● 接下来,我们将学习如下所示的一个小项目,这个项目是一个地图的项目,我们可以在地图上标记一些我们运动的位置进行记录,并且浏览器在本地会帮我们记录他们,其他一些功能后面慢慢阐述并实现 启动代码 JS代码…

基于SSM+Vue+MySQL的出租车管理系统

系统背景 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本出租车管理系统就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数据信息…

phpstorm格式化代码

快捷键:Ctrl Alt L 1.代码按等号按键值对自动对齐 第一步:点击左上角File,点击Settings 第二步:

Unity界面、组件以及脚本

Unity界面 菜单栏 菜单栏:位于屏幕顶部,包含文件、编辑、资产、游戏对象、组件、地形、动画、图形、AI、窗口、工具和帮助等菜单项。 工具栏 工具栏:位于菜单栏下方,提供了快速访问常用功能的按钮,如播放、暂停、停止…

【14.1运行版】C++俄罗斯方块-实现欢迎界面

实现欢迎界面 #include <stdio.h>//C语言形式的输入输出 #include <graphics.h>//图形库的头文件//实现欢迎界面 void welcome(void);int main(void) {welcome();//colsegraph();return 0; }void welcome(void) {//初始化画布initgraph(550, 660);//设置窗口标题H…

面壁小钢炮3.0发布:端侧ChatGPT时代的技术飞跃

一、面壁小钢炮3.0模型介绍 ➤ MiniCPM 3.0 开源地址&#xff1a; &#x1f517; https://github.com/OpenBMB/MiniCPM &#x1f517; https://huggingface.co/openbmb/MiniCPM3-4B 2024年9月5日&#xff0c;面壁智能发布 MiniCPM3-4B&#xff01;该模型的表现超越 Phi-3.5-…

【Linux】gcc/g++ 、make/Makefile、git、gdb 的使用

目录 1. Linux编译器-gcc/g1.1 编译器gcc/g的工作步骤1.2 函数库1.2.1 函数库的作用及分类1.2.2 动态链接和静态链接1.2.3 动态库和静态库的优缺点 1.3 gcc选项 2. Linux项目自动化构建工具-make/Makefile2.1 .PHONY2.2 尝试编写进度条程序 3. git3.1 安装 git3.2 下载项目到本…

Linux 竞争与并发(学习总结)

在Linux驱动开发中&#xff0c;“并发”和“竞争”是两个重要的概念&#xff0c;它们涉及到多任务环境下资源的管理和使用。 并发 (Concurrency) 并发指的是在同一时间段内&#xff0c;多个任务看似同时运行的现象。实际上&#xff0c;在单核处理器上&#xff0c;这通常是通过…

Android之LiveTemplate注释模板

目录 效果图步骤 效果图 步骤 1.首先通过File->Setting->Editor->LiveTemplate 我是放在Android下的&#xff0c;然后点击右侧&#xff08;新版本的话不在右侧&#xff09;加号&#xff0c; 点击&#xff08;加号&#xff09;之后&#xff0c;如图 /*** author:T…

RK3588 系列之3—rknn使用过程中遇到的bug

RK3588 系列之3—rknn使用过程中遇到的bug 1.librockchip_mpp.so: file format not recognized&#xff1b; treating as linker scrip2.Could not find a package configuration file provided by "OpenCV" with any of the following names参考文献 1.librockchip_…

java后端保存的本地图片通过ip+端口直接访问

直接上代码吧 package com.ydx.emms.datapro.controller;import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; import org.springframework.web.servlet.config.annotation.…

Docker Image 命令

文章目录 目录 文章目录 1 . Docker镜像是什么? 2 . 镜像命令详解 docker images docker tag docker pull docker rmi docker save 总结 1 . Docker镜像是什么? Docker image 本质上是一个 read-only 只读文件&#xff0c; 这个文件包含了文件系统、 源码、库文件…

性能测试经典案例解析——远程培训系统

各位好&#xff0c;我是 道普云 一站式云测试SaaS平台。一个在软件测试道路上不断折腾十余年的萌新。 欢迎关注我的专栏和我的主页 道普云 文章内容具有一定门槛&#xff0c;建议先赞再收藏慢慢学习&#xff0c;有不懂的问题欢迎私聊我。 希望这篇文章对想提高软件测试水平…

负载均衡调度器--LVS

文章目录 集群和分布式集群分布式 LVS介绍LVS特点LVS工作原理LVS集群架构 LVS集群中的术语CIPVIPRSDIPRIP LVS集群的工作模式NAT模式DR模式DR模式的特点: TUN模式 LVS调度算法LVS相关软件ipvsadm 命令管理集群服务&#xff1a;增、改、删管理集群上的RS:增、改、删 创建集群 LV…

神经网络搭建的那点事

1.全连接网络 python&#xff1a; nn.Linear(in, out) matlab: layer fullyConnectedLayer(outputSize) layer fullyConnectedLayer(outputSize,Name,Value) 2.add和concat的区别 concat作用 concat是通道数的增加&#xff0c;也就是说描述图像本身的特征数&#xff08;通道…

ITK-高斯滤波

作者&#xff1a;翟天保Steven 版权声明&#xff1a;著作权归作者所有&#xff0c;商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处 高斯滤波原理 高斯滤波&#xff08;Gaussian Blur&#xff09;是数字图像处理中常见的一种平滑滤波器&#xff0c;旨在通过模糊处…

Python 从入门到实战8(字典)

我们的目标是&#xff1a;通过这一套资料学习下来&#xff0c;通过熟练掌握python基础&#xff0c;然后结合经典实例、实践相结合&#xff0c;使我们完全掌握python&#xff0c;并做到独立完成项目开发的能力。 上篇文章我们通过举例学习了python 中元组的定义及相关操作。今天…

css弹性盒子——flex布局

目录 ​编辑 一、flex容器的样式属性(父元素属性) display:flex 弹性盒子&#xff0c;实现水平排列,在父盒子设置&#xff0c;适用于单行/单列 justify-content 二、flex元素的样式属性(子元素属性) 1.flex-grow 2.flex-shrink 3.flex-basis 4.flex组合属性 flex:flex-…