51c嵌入式~电路~合集25

我自己的原文哦~   https://blog.51cto.com/whaosoft/13241709

一、“开关电源”和“普通电源”的区别

什么叫开关电源

    随着电力电子技术的发展和创新,使得开关电源技术也在不断地创新。目前,开关电源以小型、轻量和高效率的特点被广泛应用几乎所有的电子设备,是当今电子信息产业飞速发展不可缺少的一种电源方式。

    开关电源是利用现代电力电子技术,控制开关管开通和关断的时间比率,维持稳定输出电压的一种电源,开关电源一般由脉冲宽度调制(PWM)控制IC和MOSFET构成。

    开关电源是相对线性电源说的,其输入端直接将交流电整流变成直流电,再在高频震荡电路的作用下,用开关管控制电流的通断,形成高频脉冲电流。在电感(高频变压器)的帮助下,输出稳定的低压直流电。

    由于变压器的磁芯大小与开关电源工作频率的平方成反比,频率越高铁心越小。这样就可以大大减小变压器,使电源减轻重量和体积。而且由于它直接控制直流,使这种电源的效率比线性电源高很多。这样就节省了能源,因此它受到人们的青睐。但它也有缺点,就是电路复杂、维修困难、对电路的污染严重;电源噪声大,不适合用于某些低噪声电路。

开关电源的特点

    开关电源一般由脉冲宽度调制(PWM)控制IC和MOSFET构成。随着随着电力电子技术的发展和创新,目前开关电源主要以小型、轻量和高效率的特点被广泛应用到几乎所有的电子设备,其重要性可见一斑。

开关电源的分类

    根据开关器件在电路中连接的方式,开关电源总的来说可分为串联式开关电源、并联式开关电源、变压器式开关电源等三大类。

    其中,变压器式开关电源还可以进一步分成:推挽式、半桥式、全桥式等多种。根据变压器的激励和输出电压的相位,又可以分成:正激式、反激式、单激式和双激式等多种。

开关电源和普通电源的区别

    普通的电源一般是线性电源,线性电源,是指调整管工作在线性状态下的电源。而在开关电源中则不一样,开关管(在开关电源中,我们一般把调整管叫做开关管)是工作在开、关两种状态下的:开 —— 电阻很小,关 —— 电阻很大。

    开关电源是一种比较新型的电源。它具有效率高,重量轻,可升、降压、输出功率大等优点。但是由于电路工作在开关状态,所以噪声比较大。

■ 举例说明:降压型开关电源

    我们来简单的说说降压型开关电源的工作原理:电路由开关(实际电路中为三极管或者场效应管),续流二极管、储能电感、滤波电容等构成。

    当开关闭合时,电源通过开关、电感给负载供电,并将部分电能储存在电感以及电容中。由于电感的自感,在开关接通后,电流增大得比较缓慢,即输出不能立刻达到电源电压值。

    一定时间后,开关断开,由于电感的自感作用(可以比较形象地认为电感中的电流有惯性作用),将保持电路中的电流不变,即从左往右继续流。这电流流过负载,从地线返回,流到续流二极管的正极,经过二极管,返回电感的左端,从而形成了一个回路。

    通过控制开关闭合跟断开的时间(即PWM——脉冲宽度调制),就可以控制输出电压。如果通过检测输出电压来控制开、关的时间,以保持输出电压不变,这就实现了稳压的目的。

    普通电源和开关电源相同的是都有电压调整管,利用反馈原理来进行稳压的,不同的是开关电源利用开关管进行调整,普通电源一般利用三极管的线性放大区进行调整。比较而言,开关电源的能耗低,对交流电压适用范围要宽,输出直流的波纹系数要好,缺点是开关脉冲干扰。

    普通半桥开关电源的主要工作原理就是上桥和下桥的开关管(频率高时开关管为VMOS)轮流导通,首先电流通过上桥开关管流入,利用电感线圈的存储功能,将电能集聚在线圈中,最后关闭上桥开关管,打开下桥的开关管,电感线圈和电容持续给外部供电。然后又关闭下桥开关管,再打开上桥让电流进入,就这样重复进行,因为要轮流开关两开关管,所以称为开关电源。

    而线性电源就不一样了,由于没有开关介入,使得上水管一直在放水,如果有多的,就会漏出来,这就是我们经常看到的某些线性电源的调整管发热量很大,用不完的电能,全部转换成了热能。从这个角度来看,线性电源的转换效率就非常低了,而且热量高的时候,元件的寿命势必要下降,影响最终的使用效果。

■ 主要区别:工作方式

    线性电源的功率调整管总是工作在放大区,流过的电流是连续的。由于调整管上损耗较大的功率,所以需要较大功率调整管并装有体积很大的散热器,发热严重,效率很低,一般在40%~60%(还得说是很好的线性电源)。

    线性电源的工作方式,使从高压变低压必须有降压装置,一般的都是变压器,也有别的像KX电源,再经过整流输出直流电压。这样一来体积也就很大,比较笨重,效率低、发热量也大;但也有优点:纹波小、调整率好、对外干扰小、适合用于模拟电路/各类放大器等。

    开关电源它的功率器件工作在开关状态,在电压调整时能量是通过电感线圈来临时贮存,这样他的损耗就小,效率也就高,对散热的要求低,但它对变压器和贮能电感也有了更高的要求,要用低损耗高磁导率的材料来做。它的变压器就是一个字小。总效率在80%~98%,开关电源的效率高但体积小,但是和线性电源比它的纹波,电压电流调整率就有一定的折扣了。

二、获取STM32代码运行时间

测试代码的运行时间的两种方法:

  • 使用单片机内部定时器,在待测程序段的开始启动定时器,在待测程序段的结尾关闭定时器。为了测量的准确性,要进行多次测量,并进行平均取值。
  • 借助示波器的方法是:在待测程序段的开始阶段使单片机的一个GPIO输出高电平,在待测程序段的结尾阶段再令这个GPIO输出低电平。用示波器通过检查高电平的时间长度,就知道了这段代码的运行时间。显然,借助于示波器的方法更为简便。

借助示波器方法的实例

    Delay_us函数使用STM32系统滴答定时器实现:

#include "systick.h"/* SystemFrequency / 1000    1ms中断一次* SystemFrequency / 100000     10us中断一次* SystemFrequency / 1000000 1us中断一次*/#define SYSTICKPERIOD                    0.000001
#define SYSTICKFREQUENCY            (1/SYSTICKPERIOD)/*** @brief  读取SysTick的状态位COUNTFLAG* @param  无* @retval The new state of USART_FLAG (SET or RESET).*/
static FlagStatus SysTick_GetFlagStatus(void) 
{
if(SysTick->CTRL&SysTick_CTRL_COUNTFLAG_Msk) {
return SET;}
else{
return RESET;}
}/*** @brief  配置系统滴答定时器 SysTick* @param  无* @retval 1 = failed, 0 = successful*/
uint32_t SysTick_Init(void)
{
/* 设置定时周期为1us  */
if (SysTick_Config(SystemCoreClock / SYSTICKFREQUENCY)) { 
/* Capture error */
return (1);}/* 关闭滴答定时器且禁止中断  */SysTick->CTRL &= ~ (SysTick_CTRL_ENABLE_Msk | SysTick_CTRL_TICKINT_Msk);                                                  
return (0);
}/*** @brief   us延时程序,10us为一个单位* @param*        @arg nTime: Delay_us( 10 ) 则实现的延时为 10 * 1us = 10us* @retval  无*/
void Delay_us(__IO uint32_t nTime)
{     
/* 清零计数器并使能滴答定时器 */SysTick->VAL   = 0;  SysTick->CTRL |=  SysTick_CTRL_ENABLE_Msk;     for( ; nTime > 0 ; nTime--){
/* 等待一个延时单位的结束 */
while(SysTick_GetFlagStatus() != SET);}/* 关闭滴答定时器 */SysTick->CTRL &= ~ SysTick_CTRL_ENABLE_Msk;
}

    检验Delay_us执行时间中用到的GPIO(gpio.h、gpio.c)的配置:

#ifndef __GPIO_H
#define    __GPIO_H#include "stm32f10x.h"#define     LOW          0
#define     HIGH         1/* 带参宏,可以像内联函数一样使用 */
#define TX(a)                if (a)    \GPIO_SetBits(GPIOB,GPIO_Pin_0);\
else        \GPIO_ResetBits(GPIOB,GPIO_Pin_0)
void GPIO_Config(void);#endif#include "gpio.h"/*** @brief  初始化GPIO* @param  无* @retval 无*/
void GPIO_Config(void)
{        
/*定义一个GPIO_InitTypeDef类型的结构体*/GPIO_InitTypeDef GPIO_InitStructure;/*开启LED的外设时钟*/RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure);    
}

    在main函数中检验Delay_us的执行时间:

    示波器的观察结果:

    可见Delay_us(100),执行了大概102us,而Delay_us(1)执行了2.2us。

    更改一下main函数的延时参数:

    示波器的观察结果:

    可见Delay_us(100),执行了大概101us,而Delay_us(10)执行了11.4us。

    结论:此延时函数基本上还是可靠的。​

使用定时器方法的实例

    Delay_us函数使用STM32定时器2实现:

#include "timer.h"/* SystemFrequency / 1000            1ms中断一次* SystemFrequency / 100000     10us中断一次* SystemFrequency / 1000000         1us中断一次*/#define SYSTICKPERIOD                    0.000001
#define SYSTICKFREQUENCY            (1/SYSTICKPERIOD)/*** @brief  定时器2的初始化,,定时周期1uS* @param  无* @retval 无*/
void TIM2_Init(void)
{TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;/*AHB = 72MHz,RCC_CFGR的PPRE1 = 2,所以APB1 = 36MHz,TIM2CLK = APB1*2 = 72MHz */RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);/* Time base configuration */TIM_TimeBaseStructure.TIM_Period = SystemCoreClock/SYSTICKFREQUENCY -1;TIM_TimeBaseStructure.TIM_Prescaler = 0;TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);TIM_ARRPreloadConfig(TIM2, ENABLE);/* 设置更新请求源只在计数器上溢或下溢时产生中断 */TIM_UpdateRequestConfig(TIM2,TIM_UpdateSource_Global); TIM_ClearFlag(TIM2, TIM_FLAG_Update);
}/*** @brief   us延时程序,10us为一个单位* @param  *        @arg nTime: Delay_us( 10 ) 则实现的延时为 10 * 1us = 10us* @retval  无*/
void Delay_us(__IO uint32_t nTime)
{     
/* 清零计数器并使能滴答定时器 */TIM2->CNT   = 0;  TIM_Cmd(TIM2, ENABLE);     for( ; nTime > 0 ; nTime--){
/* 等待一个延时单位的结束 */
while(TIM_GetFlagStatus(TIM2, TIM_FLAG_Update) != SET);TIM_ClearFlag(TIM2, TIM_FLAG_Update);}TIM_Cmd(TIM2, DISABLE);
}

    在main函数中检验Delay_us的执行时间:

#include "stm32f10x.h"
#include "Timer_Drive.h"
#include "gpio.h"
#include "systick.h"TimingVarTypeDef Time;int main(void)
{    TIM2_Init();    SysTick_Init();SysTick_Time_Init(&Time);for(;;){SysTick_Time_Start(); Delay_us(1000);SysTick_Time_Stop();}     
}

    怎么去看检测结果呢?用调试的办法,打开调试界面后,将Time变量添加到Watch一栏中。然后全速运行程序,既可以看到Time中保存变量的变化情况,其中TimeWidthAvrage就是最终的结果。

    可以看到TimeWidthAvrage的值等于0x119B8,十进制数对应72120,滴答定时器的一个滴答为1/72M(s),所以Delay_us(1000)的执行时间就是72120*1/72M (s) = 0.001001s,也就是1ms。验证成功。

    备注:定时器方法输出检测结果有待改善,你可以把得到的TimeWidthAvrage转换成时间(以us、ms、s)为单位,然后通过串口打印出来,不过这部分工作对于经常使用调试的人员来说也可有可无。相关推荐:学习STM32单片机,绕不开的串口。​

两种方法对比

软件测试方法

    操作起来复杂,由于在原代码基础上增加了测试代码,可能会影响到原代码的工作,测试可靠性相对较低。由于使用32位的变量保存systick的计数次数,计时的最大长度可以达到2^32/72M = 59.65 s。

示波器方法

    操作简单,在原代码基础上几乎没有增加代码,测试可靠性很高。由于示波器的显示能力有限,超过1s以上的程序段,计时效果不是很理想。但是,通常的单片机程序实时性要求很高,一般不会出现程序段时间超过秒级的情况。

三、xxx

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深度学习 Pytorch 基础网络手动搭建与快速实现

为了方便后续练习的展开,我们尝试自己创建一个数据生成器,用于自主生成一些符合某些条件、具备某些特性的数据集。 导入相关的包 # 随机模块 import random# 绘图模块 import matplotlib as mpl import matplotlib.pyplot as plt# 导入numpy import nu…

【文件上传】

目录 一. 介绍二. 本地存储三. 阿里云OSS3.1 准备工作3.2 入门程序3.3 案例集成3.4 程序优化 \quad 一. 介绍 \quad 三要素缺一不可 \quad 二. 本地存储 \quad 解决相同命名覆盖问题 \quad 三. 阿里云OSS \quad \quad 3.1 准备工作 \quad \quad 3.2 入门程序 \quad \quad 3.3…

Deepseek-R1 和 OpenAI o1 这样的推理模型普遍存在“思考不足”的问题

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

Vue3的el-table-column下拉输入实时查询API数据选择的实现方法

由于本人对el-table-column有下拉输入选择的要求&#xff0c;根据网上搜索的资料及本人优化&#xff0c;推出我比较满意的方法&#xff0c;供各位读者参考使用。 效果图 el-table-column写法 <el-table-columnlabel"货品编号"align"center"prop"…

Electron使用WebAssembly实现CRC-8 MAXIM校验

Electron使用WebAssembly实现CRC-8 MAXIM校验 将C/C语言代码&#xff0c;经由WebAssembly编译为库函数&#xff0c;可以在JS语言环境进行调用。这里介绍在Electron工具环境使用WebAssembly调用CRC-8 MAXIM格式校验的方式。 CRC-8 MAXIM校验函数WebAssembly源文件 C语言实现C…

使用 Elastic Cloud Hosted 优化长期数据保留:确保政府合规性和效率

作者&#xff1a;来自 Elastic Jennie Davidowitz 在数字时代&#xff0c;州和地方政府越来越多地承担着管理大量数据的任务&#xff0c;同时确保遵守严格的监管要求。这些法规可能因司法管辖区而异&#xff0c;通常要求将数据保留较长时间 —— 有时从一年到七年不等。遵守刑事…

安卓(android)饭堂广播【Android移动开发基础案例教程(第2版)黑马程序员】

一、实验目的&#xff08;如果代码有错漏&#xff0c;可查看源码&#xff09; 1.熟悉广播机制的实现流程。 2.掌握广播接收者的创建方式。 3.掌握广播的类型以及自定义官博的创建。 二、实验条件 熟悉广播机制、广播接收者的概念、广播接收者的创建方式、自定广播实现方式以及有…

OPENPPP2 —— VMUX_NET 多路复用原理剖析

在阅读本文之前&#xff0c;必先了解以下几个概念&#xff1a; 1、MUX&#xff08;Multiplexer&#xff09;&#xff1a;合并多个信号到单一通道。 2、DEMUX&#xff08;Demultiplexer&#xff09;&#xff1a;从单一通道分离出多个信号。 3、单一通道&#xff0c;可汇聚多个…

【Linux】从硬件到软件了解进程

个人主页~ 从硬件到软件了解进程 一、冯诺依曼体系结构二、操作系统三、操作系统进程管理1、概念2、PCB和task_struct3、查看进程4、通过系统调用fork创建进程&#xff08;1&#xff09;简述&#xff08;2&#xff09;系统调用生成子进程的过程〇提出问题①fork函数②父子进程关…

Deep Crossing:深度交叉网络在推荐系统中的应用

实验和完整代码 完整代码实现和jupyter运行&#xff1a;https://github.com/Myolive-Lin/RecSys--deep-learning-recommendation-system/tree/main 引言 在机器学习和深度学习领域&#xff0c;特征工程一直是一个关键步骤&#xff0c;尤其是对于大规模的推荐系统和广告点击率预…

AI智慧社区--Excel表的导入导出

Excel表导入导出的环境配置 1.导入依赖 <dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-spring-boot-starter</artifactId><version>${easypoi.version}</version></dependency>2.配置Excel的导入导出以及…

【C++】B2122 单词翻转

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 &#x1f4af;前言&#x1f4af;题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 &#x1f4af;一、我的做法代码实现&#xff1a;代码解析思路分析 &#x1f4af;二、老师的第一种做法代码实现&a…

【流媒体】搭建流媒体服务器

搭建Windows Nginx服务器 搭建 下载nginx工具包解压至本地&#xff0c;并在cmd窗口中切换至nginx所在的本地目录修改 conf/nginx.conf 文件&#xff0c;更改其端口号 server中的 listen的端口号从 80改为 8080&#xff0c;因为80经常被其他服务占用&#xff0c;导致无法打开 …

编程AI深度实战:给vim装上AI

系列文章&#xff1a; 编程AI深度实战&#xff1a;私有模型deep seek r1&#xff0c;必会ollama-CSDN博客 编程AI深度实战&#xff1a;自己的AI&#xff0c;必会LangChain-CSDN博客 编程AI深度实战&#xff1a;给vim装上AI-CSDN博客 编程AI深度实战&#xff1a;火的编程AI&…

MySQL锁详解

MySQL锁详解 数据库的锁机制锁的分类行级锁与表级锁行级锁之共享锁与排他锁乐观锁与悲观锁悲观锁乐观锁 Innodb存储引擎的锁机制行级锁与表级锁的使用区分三种行锁的算法死锁的问题多版本并发控制MVCC 数据库的锁机制 什么是锁&#xff1f;锁是一种保障数据的机制 为何要用锁…

100 ,【8】 buuctf web [蓝帽杯 2021]One Pointer PHP(别看)

进入靶场 没提示&#xff0c;去看源代码。 user.php <?php // 定义一个名为 User 的类&#xff0c;该类可用于表示用户相关信息或执行与用户有关的操作 class User{// 声明一个公共属性 $count&#xff0c;可在类的内部和外部直接访问// 这个属性可能用于记录与用户相关…

【leetcode练习·二叉树拓展】归并排序详解及应用

本文参考labuladong算法笔记[拓展&#xff1a;归并排序详解及应用 | labuladong 的算法笔记] “归并排序就是二叉树的后序遍历”——labuladong 就说归并排序吧&#xff0c;如果给你看代码&#xff0c;让你脑补一下归并排序的过程&#xff0c;你脑子里会出现什么场景&#xff…

解决PyG安装中torch-sparse安装失败问题:详细指南

1 问题描述 最近在学习GNN&#xff0c;需要使用PyTorch Geometric&#xff08;PyG&#xff09;库。在安装PyG的过程中&#xff0c;遇到了torch-sparse安装失败的问题&#xff0c;错误提示为&#xff1a; ERROR: Failed building wheel for torch-sparse本文将详细记录问题的解…

四、GPIO中断实现按键功能

4.1 GPIO简介 输入输出&#xff08;I/O&#xff09;是一个非常重要的概念。I/O泛指所有类型的输入输出端口&#xff0c;包括单向的端口如逻辑门电路的输入输出管脚和双向的GPIO端口。而GPIO&#xff08;General-Purpose Input/Output&#xff09;则是一个常见的术语&#xff0c…

分析哲学:从 语言解剖到 思想澄清的哲学探险

分析哲学&#xff1a;从 语言解剖 到 思想澄清 的哲学探险 第一节&#xff1a;分析哲学的基本概念与公式解释 【通俗讲解&#xff0c;打比方来讲解&#xff01;】 分析哲学&#xff0c;就像一位 “语言侦探”&#xff0c;专注于 “解剖语言”&#xff0c;揭示我们日常使用的语…