高边开关驱动容性负载

news2024/11/26 12:51:15

Hello UU们,有做汽车电子的吗?

如果做汽车电子可能会用到很多高边开关,高边开关带的负载是让容性负载,或者是感性负载时候会比较恶劣,容性负载可能一下子不容易带起来.因为电池和负载电容上的巨大压差,高边开关上流过的电流非常之大,为此我们可以使用缓慢的打开高边开关,高边开关的EN不像是自己用Mosfet一样内阻可以缓慢的线性变化,为此Frank Pan提出用PWM渐变去控制高边开关,使负载电容上的电压缓慢增加,又不让高边开关过流保护.

但每个MCU的资源有限,可能没那么多PWM资源和定时器资源,在MCU不变的情况下,尽量的让程序复用。图1是类比高边开关的产品

图1:类比智能高边产品

以下是程序代码:

#include "main.h"

#include "string.h"

void SystemClock_Config(void);

/*注释:步骤1 定义GPIO 端口*/

#define HSD_Pin GPIO_PIN_4

#define HSD_Port GPIOG

#define HSD_Clk_Enable __HAL_RCC_GPIOG_CLK_ENABLE()

#define HSD_Pin_H   HAL_GPIO_WritePin(HSD_Port,HSD_Pin,GPIO_PIN_SET)

#define HSD_Pin_L   HAL_GPIO_WritePin(HSD_Port,HSD_Pin,GPIO_PIN_RESET)

/*注释:步骤2 初始化引脚*/

void HSD_Init(void)

{

    GPIO_InitTypeDef GPIO_InitStruct = {0};

    /*注释:步骤3 打开引脚时钟*/

    HSD_Clk_Enable;

  GPIO_InitStruct.Pin = HSD_Pin;

    /*注释:步骤4 设置为输出模式*/

  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;

  GPIO_InitStruct.Pull = GPIO_NOPULL;

  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;

  HAL_GPIO_Init(HSD_Port, &GPIO_InitStruct);

}

/*注释:步骤5 控制HSD 启动的函数*/

/* HSD State 设置高边使能或者关闭

     设置任意不为0的参数就使能

     参数设置为0就关闭

*/

void HSD_Ctrl(uint16_t HSDState)

{

    /*

        注释:步骤6

        i设置最大步数 改下面1000的这个参数

        j设置最大占空比比例 改下面50的这个参数

        k设置每步延时步长 改下面30的这个参数

    */

    uint16_t i,j,k;

    if(HSDState)

    {

        for(i=0;i<1000;i++)

        {

            HSD_Pin_L;

            for(j=0;j<50;j++)

                for(k=0;k<30;k++);

            HSD_Pin_H;

            for(j=0;j<i;j++)

                for(k=0;k<30;k++);

            HSD_Pin_L;

        }

        HSD_Pin_H;

    }

    else

        HSD_Pin_L;

}

/* USER CODE END 0 */

/**

  * @brief  The application entry point.

  * @retval int

  */

int main(void)

{

  HAL_Init();

  SystemClock_Config();

  /* USER CODE BEGIN 2 */

    /*注释:步骤6 主程序初始化高边开关*/

    HSD_Init();

  /* USER CODE END 2 */

  /* Infinite loop */

  /* USER CODE BEGIN WHILE */

  while (1)

  {

    /* USER CODE END WHILE */

        /*注释:步骤7 设置高边开关开*/

        HSD_Ctrl(0x00);

        HAL_Delay(1000);

        /*注释:步骤7 设置高边开关关*/

        HSD_Ctrl(0x01);

        HAL_Delay(10);

    /* USER CODE BEGIN 3 */

  }

  /* USER CODE END 3 */

}

/**

  * @brief System Clock Configuration

  * @retval None

  */

void SystemClock_Config(void)

{

  RCC_OscInitTypeDef RCC_OscInitStruct = {0};

  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

  /** Supply configuration update enable

  */

  HAL_PWREx_ConfigSupply(PWR_LDO_SUPPLY);

  /** Configure the main internal regulator output voltage

  */

  __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE0);

  while(!__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY)) {}

  /** Initializes the RCC Oscillators according to the specified parameters

  * in the RCC_OscInitTypeDef structure.

  */

  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI48|RCC_OSCILLATORTYPE_HSE;

  RCC_OscInitStruct.HSEState = RCC_HSE_BYPASS;

  RCC_OscInitStruct.HSI48State = RCC_HSI48_ON;

  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;

  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;

  RCC_OscInitStruct.PLL.PLLM = 4;

  RCC_OscInitStruct.PLL.PLLN = 275;

  RCC_OscInitStruct.PLL.PLLP = 1;

  RCC_OscInitStruct.PLL.PLLQ = 4;

  RCC_OscInitStruct.PLL.PLLR = 2;

  RCC_OscInitStruct.PLL.PLLRGE = RCC_PLL1VCIRANGE_1;

  RCC_OscInitStruct.PLL.PLLVCOSEL = RCC_PLL1VCOWIDE;

  RCC_OscInitStruct.PLL.PLLFRACN = 0;

  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)

  {

    Error_Handler();

  }

  /** Initializes the CPU, AHB and APB buses clocks

  */

  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK

                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2

                              |RCC_CLOCKTYPE_D3PCLK1|RCC_CLOCKTYPE_D1PCLK1;

  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;

  RCC_ClkInitStruct.SYSCLKDivider = RCC_SYSCLK_DIV1;

  RCC_ClkInitStruct.AHBCLKDivider = RCC_HCLK_DIV2;

  RCC_ClkInitStruct.APB3CLKDivider = RCC_APB3_DIV2;

  RCC_ClkInitStruct.APB1CLKDivider = RCC_APB1_DIV2;

  RCC_ClkInitStruct.APB2CLKDivider = RCC_APB2_DIV2;

  RCC_ClkInitStruct.APB4CLKDivider = RCC_APB4_DIV2;

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_3) != HAL_OK)

  {

    Error_Handler();

  }

}

/**

  * @brief  This function is executed in case of error occurrence.

  * @retval None

  */

void Error_Handler(void)

{

  /* USER CODE BEGIN Error_Handler_Debug */

  /* User can add his own implementation to report the HAL error return state */

  __disable_irq();

  while (1)

  {

  }

  /* USER CODE END Error_Handler_Debug */

}

#ifdef  USE_FULL_ASSERT

/**

  * @brief  Reports the name of the source file and the source line number

  *         where the assert_param error has occurred.

  * @param  file: pointer to the source file name

  * @param  line: assert_param error line source number

  * @retval None

  */

void assert_failed(uint8_t *file, uint32_t line)

{

  /* USER CODE BEGIN 6 */

  /* User can add his own implementation to report the file name and line number,

     ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */

  /* USER CODE END 6 */

}

#endif /* USE_FULL_ASSERT */

/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

以上都比较容易看懂,其中有一段解释下,如代码2所示。

代码2:

  1. 其中K参数可以不用看他,单纯用于延时,不想在写个Delay函数
  2. j参数控制低电平持续的时间是不变的
  3. 随着i越来越大,HSD_Pin_H持续的比例慢慢增加
  4. 最大占空比就是i和j的比值,等高边打开不保护的占空比即可
  5. 运行到最大占空比之后高边就常高了

void HSD_Ctrl(uint16_t HSDState)

{

    uint16_t i,j,k;

    if(HSDState)

    {

        for(i=0;i<1000;i++)

        {

            HSD_Pin_L;

            for(j=0;j<50;j++)

                for(k=0;k<30;k++);

            HSD_Pin_H;

            for(j=0;j<i;j++)

                for(k=0;k<30;k++);

            HSD_Pin_L;

        }

        HSD_Pin_H;

    }

    else

        HSD_Pin_L;

}

测试结果

关注公众号不迷路

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

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

相关文章

Firefly: 一站式大模型训练工具

Firefly: 一站式大模型训练工具 转载自GitHub项目&#xff1a;https://github.com/yangjianxin1/Firefly 项目简介 Firefly 是一个开源的大模型训练项目&#xff0c;支持对主流的大模型进行预训练、指令微调和DPO&#xff0c;包括但不限于Gemma、Qwen1.5、MiniCPM、Llama、I…

关于并发编程的一些总结

并发编程 1.synchronized是什么&#xff1f; synchronized是Java中的一个关键字&#xff0c;主要是为了解决多个线程访问共享资源的同步性&#xff0c;可以保证被它修饰的代码块或方法在任何时间至多只有一个线程执行。 2.synchronized的进化史? 在早期Java版本中&#xf…

Python合并两张图片 | 先叠透明度再合并 (附Demo)

目录 前言正文 前言 用在深度学习可增加噪音&#xff0c;增加数据集等 推荐阅读&#xff1a;Pytorch 图像增强 实现翻转裁剪色调等 附代码&#xff08;全&#xff09; 正文 使用Pillow库来处理图像&#xff08;以下两张图来自网络&#xff09; 图一&#xff1a; 图二&…

飞塔防火墙开局百篇——002.FortiGate上网配置——透明模式配置(Transparent)

透明模式配置 开启透明模式创建策略 在不改变现有网络拓扑前提下&#xff0c;将防火墙NGFW以透明模式部署到网络中&#xff0c;放在路由器和交换机之间&#xff0c;防火墙为透明模式&#xff0c;对内网网段192.168.1.0/24的上网进行4~7层的安全防护。 登陆FortiGate防火墙界面&…

Selenium自动化测试面试题全家桶

1、什么是自动化测试、自动化测试的优势是什么&#xff1f; 通过工具或脚本代替手工测试执行过程的测试都叫自动化测试。 自动化测试的优势&#xff1a; 1、减少回归测试成本 2、减少兼容性测试成本 3、提高测试反馈速度 4、提高测试覆盖率 5、让测试工程师做更有意义的…

2021年中国环境统计年鉴、工业企业污染排放数据库

《中国环境统计年鉴》是国家统计局和生态环境部及其他有关部委共同编辑完成的一本反映我国环境各领域基本情况的年度综合统计资料。收录了上一年年全国各省、自治区、直辖市环境各领域的基本数据和主要年份的全国主要环境统计数据。 内容共分为十二个部分,即:1.自然状况;2.水环…

收下这份实操案例,还怕不会用Jmeter接口测试工具

一、简介 JMeter&#xff0c;一个100&#xff05;的纯Java桌面应用&#xff0c;由Apache组织的开放源代码项目&#xff0c;它是接口功能、自动化、性 能测试的工具。具有高可扩展性、支持HTTP、HTTPS、TCP、等多种协议&#xff0c;还可以自己编写Java脚本对 协议进行扩展。 官…

vue 浏览器刷新报404,系统正常访问没问题

这个情况是因为vue的路由出问题了。 采用hash模式即可。 详细请了解&#xff1a; vue router 的两种路由模式hash与history的区别_vue hisotry-CSDN博客 vue默认是是hash

微信小程序(一)

WebView app.是全局配置&#xff0c;app.json是全局配置文件&#xff0c;在页面的.json配置文件中的配置会覆盖我们全局的配置 快捷键&#xff1a; .box 敲回车 ----- <view class"box"></view> .row*8 敲回车&#xff1a; .row{$}*8 敲回车 案例1&…

SpringCloud OpenFeign 服务接口调用

一、前言 接下来是开展一系列的 SpringCloud 的学习之旅&#xff0c;从传统的模块之间调用&#xff0c;一步步的升级为 SpringCloud 模块之间的调用&#xff0c;此篇文章为第四篇&#xff0c;即介绍 Feign 和 OpenFeign 服务接口调用。 二、概述 2.1 Feign 是什么 Feign 是一…

Linux运维:深入了解 Linux 目录结构

Linux运维&#xff1a;深入了解 Linux 目录结构 一、 Linux 目录结构与 Windows之间的主要区别二、Linux根目录结构三、常见目录及其作用 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 一、 Linux 目录结构与 Windows之间的主要区别 1、根…

PXE+Kickstart无人值守安装操作系统

什么是PXE&#xff1f; PXE&#xff0c;全名Pre-boot Execution Environment&#xff0c;预启动执行环境&#xff1b; 通过网络接口启动计算机&#xff0c;不依赖本地存储设备&#xff08;如硬盘&#xff09;或本地已安装的操作系统&#xff1b; 由Intel和Systemsoft公司于199…

2007-2021年中国省级知识产权保护指数数据

2007-2021年中国省级知识产权保护指数数据 1、时间&#xff1a;2007-2021年 2、范围&#xff1a;31省市 3、指标&#xff1a;&#xff1a;年份、省份、IPP&#xff08;知识产权保护指数&#xff09; 4、来源&#xff1a;全国知识产权发展状况报告 5、指标解释&#xff1a;…

游戏党们的福利来啦~格行5G随身WiFi,王者玩家的靠谱之选!5G随身wifi品牌推荐第一名!

作为一名资深王者荣耀玩家&#xff0c;我深知网络对于游戏的重要性。那种关键时刻网络卡顿、延迟&#xff0c;导致错失战机、输掉比赛的痛苦&#xff0c;真是让人欲哭无泪。直到我的游戏搭子给我推荐了一款格行5G随身wifi&#xff0c;简直是打开新世界的大门&#xff01; 格行…

Singularity(四)| 自定义容器

Singularity&#xff08;四&#xff09;| 自定义容器 4.1 Singularity Definition 文件 对于可复制的、高质量的容器&#xff0c;我们应该使用定义文件&#xff08;Definition File&#xff09;构建 Singularity 容器 。使用定义文件的方式可以在纯文本文件中描述容器的配置和…

考研数学|汤家凤《1800》vs 张宇《1000》,怎么选?

汤家凤的1800题和张宇的1000题都是备考数学考研的热门选择&#xff0c;但究竟哪个更适合备考呢&#xff1f;下面分享一些见解。 首先&#xff0c;让我们来看看传统习题册存在的一些问题。虽然传统习题册通常会覆盖考试的各个知识点和题型&#xff0c;但其中一些问题在于它们可…

论文阅读:Editing Large Language Models: Problems, Methods, and Opportunities

Editing Large Language Models: Problems, Methods, and Opportunities 论文链接 代码链接 摘要 由于大语言模型&#xff08;LLM&#xff09;中可能存在一些过时的、不适当的和错误的信息&#xff0c;所以有必要纠正模型中的相关信息。如何高效地修改模型中的相关信息而不影…

LeetCode 每日一题 Day 95-101

2917. 找出数组中的 K-or 值 给你一个整数数组 nums 和一个整数 k 。让我们通过扩展标准的按位或来介绍 K-or 操作。在 K-or 操作中&#xff0c;如果在 nums 中&#xff0c;至少存在 k 个元素的第 i 位值为 1 &#xff0c;那么 K-or 中的第 i 位的值是 1 。 返回 nums 的 K-o…

SpringBoot扩展篇:Spring注入 @Autowired @Resource

Spring注入 Autowired & Resource 1. 概述1.1 职责1.2 流程概述 2. Demo3. AutowiredAnnotationBeanPostProcessor注册4. 注册元数据4.1 AutowiredAnnotationBeanPostProcessor#postProcessMergedBeanDefinition4.2 AutowiredAnnotationBeanPostProcessor#findAutowiringMe…

【NR 定位】3GPP NR Positioning 5G定位标准解读(十二)-Multi-RTT定位

前言 3GPP NR Positioning 5G定位标准&#xff1a;3GPP TS 38.305 V18 3GPP 标准网址&#xff1a;Directory Listing /ftp/ 【NR 定位】3GPP NR Positioning 5G定位标准解读&#xff08;一&#xff09;-CSDN博客 【NR 定位】3GPP NR Positioning 5G定位标准解读&#xff08;…