STM32CubeMX HAL F405 TIM1输出多路不同频率及占空比的方波(PWM)(输出比较模式)

TIM1_CH1
TIM1_CH1N

TIM1_CH2
TIM1_CH2N

TIM1_CH3
TIM1_CH3N

TIM1_CH4

TIM1的通道1、2、3输出同频率(20KHz)的PWM波形(占空比50%)
TIM1的通道1输出100Hz的PWM波形(占空比50%)
在这里插入图片描述


#include "tim.h"

/* USER CODE BEGIN 0 */
uint16_t f1 = 100; //168000000/84/100 = 20khz
uint16_t f2 = 100; //168000000/84/100 = 20khz
uint16_t f3 = 100; //168000000/84/100 = 20khz
uint16_t f4 = 20000; //168000000/84/40000 = 100hz  


float Duty_Cycle1 = 0.5f;
float Duty_Cycle2 = 0.5f;
float Duty_Cycle3 = 0.5f;
float Duty_Cycle4 = 0.5f;

/* USER CODE END 0 */

TIM_HandleTypeDef htim1;

/* TIM1 init function */
void MX_TIM1_Init(void)
{

  /* USER CODE BEGIN TIM1_Init 0 */

  /* USER CODE END TIM1_Init 0 */

  TIM_ClockConfigTypeDef sClockSourceConfig = {0};
  TIM_MasterConfigTypeDef sMasterConfig = {0};
  TIM_OC_InitTypeDef sConfigOC = {0};
  TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig = {0};

  /* USER CODE BEGIN TIM1_Init 1 */

  /* USER CODE END TIM1_Init 1 */
  htim1.Instance = TIM1;
  htim1.Init.Prescaler = 83;
  htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim1.Init.Period = 65535;
  htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  htim1.Init.RepetitionCounter = 0;
  htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
  if (HAL_TIM_Base_Init(&htim1) != HAL_OK)
  {
    Error_Handler();
  }
  sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
  if (HAL_TIM_ConfigClockSource(&htim1, &sClockSourceConfig) != HAL_OK)
  {
    Error_Handler();
  }
  if (HAL_TIM_OC_Init(&htim1) != HAL_OK)
  {
    Error_Handler();
  }
  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  if (HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig) != HAL_OK)
  {
    Error_Handler();
  }
  sConfigOC.OCMode = TIM_OCMODE_TOGGLE;
  sConfigOC.Pulse = 0;
  sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
  sConfigOC.OCNPolarity = TIM_OCNPOLARITY_HIGH;
  sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
  sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET;
  sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET;
  if (HAL_TIM_OC_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
  {
    Error_Handler();
  }
  if (HAL_TIM_OC_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_2) != HAL_OK)
  {
    Error_Handler();
  }
  if (HAL_TIM_OC_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_3) != HAL_OK)
  {
    Error_Handler();
  }
  if (HAL_TIM_OC_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_4) != HAL_OK)
  {
    Error_Handler();
  }
  sBreakDeadTimeConfig.OffStateRunMode = TIM_OSSR_DISABLE;
  sBreakDeadTimeConfig.OffStateIDLEMode = TIM_OSSI_DISABLE;
  sBreakDeadTimeConfig.LockLevel = TIM_LOCKLEVEL_OFF;
  sBreakDeadTimeConfig.DeadTime = 8; // 8/168M=47.6ns
  sBreakDeadTimeConfig.BreakState = TIM_BREAK_DISABLE;
  sBreakDeadTimeConfig.BreakPolarity = TIM_BREAKPOLARITY_HIGH;
  sBreakDeadTimeConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_DISABLE;
  if (HAL_TIMEx_ConfigBreakDeadTime(&htim1, &sBreakDeadTimeConfig) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN TIM1_Init 2 */
//	__HAL_TIM_DISABLE_OCxPRELOAD(&htim1,TIM_CHANNEL_1);
//	__HAL_TIM_DISABLE_OCxPRELOAD(&htim1,TIM_CHANNEL_2);
//	__HAL_TIM_DISABLE_OCxPRELOAD(&htim1,TIM_CHANNEL_3);
//	__HAL_TIM_DISABLE_OCxPRELOAD(&htim1,TIM_CHANNEL_4);
	
	HAL_TIM_OC_Start_IT(&htim1,TIM_CHANNEL_1);
	HAL_TIMEx_OCN_Start(&htim1,TIM_CHANNEL_1);
	
	HAL_TIM_OC_Start_IT(&htim1,TIM_CHANNEL_2);
	HAL_TIMEx_OCN_Start(&htim1,TIM_CHANNEL_2);
	
	HAL_TIM_OC_Start_IT(&htim1,TIM_CHANNEL_3);
	HAL_TIMEx_OCN_Start(&htim1,TIM_CHANNEL_3);
	
	HAL_TIM_OC_Start_IT(&htim1,TIM_CHANNEL_4);
	
	
	
  /* USER CODE END TIM1_Init 2 */
  HAL_TIM_MspPostInit(&htim1);

}

void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle)
{

  if(tim_baseHandle->Instance==TIM1)
  {
  /* USER CODE BEGIN TIM1_MspInit 0 */

  /* USER CODE END TIM1_MspInit 0 */
    /* TIM1 clock enable */
    __HAL_RCC_TIM1_CLK_ENABLE();

    /* TIM1 interrupt Init */
    HAL_NVIC_SetPriority(TIM1_CC_IRQn, 0, 0);
    HAL_NVIC_EnableIRQ(TIM1_CC_IRQn);
  /* USER CODE BEGIN TIM1_MspInit 1 */

  /* USER CODE END TIM1_MspInit 1 */
  }
}
void HAL_TIM_MspPostInit(TIM_HandleTypeDef* timHandle)
{

  GPIO_InitTypeDef GPIO_InitStruct = {0};
  if(timHandle->Instance==TIM1)
  {
  /* USER CODE BEGIN TIM1_MspPostInit 0 */

  /* USER CODE END TIM1_MspPostInit 0 */

    __HAL_RCC_GPIOB_CLK_ENABLE();
    __HAL_RCC_GPIOA_CLK_ENABLE();
    /**TIM1 GPIO Configuration
    PB13     ------> TIM1_CH1N
    PB14     ------> TIM1_CH2N
    PB15     ------> TIM1_CH3N
    PA8     ------> TIM1_CH1
    PA9     ------> TIM1_CH2
    PA10     ------> TIM1_CH3
    PA11     ------> TIM1_CH4
    */
    GPIO_InitStruct.Pin = GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    GPIO_InitStruct.Alternate = GPIO_AF1_TIM1;
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

    GPIO_InitStruct.Pin = GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    GPIO_InitStruct.Alternate = GPIO_AF1_TIM1;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  /* USER CODE BEGIN TIM1_MspPostInit 1 */

  /* USER CODE END TIM1_MspPostInit 1 */
  }

}

void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef* tim_baseHandle)
{

  if(tim_baseHandle->Instance==TIM1)
  {
  /* USER CODE BEGIN TIM1_MspDeInit 0 */

  /* USER CODE END TIM1_MspDeInit 0 */
    /* Peripheral clock disable */
    __HAL_RCC_TIM1_CLK_DISABLE();

    /* TIM1 interrupt Deinit */
    HAL_NVIC_DisableIRQ(TIM1_CC_IRQn);
  /* USER CODE BEGIN TIM1_MspDeInit 1 */

  /* USER CODE END TIM1_MspDeInit 1 */
  }
}

/* USER CODE BEGIN 1 */
void HAL_TIM_OC_DelayElapsedCallback(TIM_HandleTypeDef *htim)
{
	uint16_t OC_Count = 0;
	if(htim->Instance == TIM1)
	{
		 if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)
		 {
				OC_Count=__HAL_TIM_GET_COMPARE(&htim1,TIM_CHANNEL_1);//获取定时器计数值
				if(GPIO_PIN_RESET == HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_8))
				{
					__HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_1,OC_Count + f1 * Duty_Cycle1);
				}
				else
				{
					__HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_1,OC_Count + f1 * (1 - Duty_Cycle1));
				}	 
		 }
		 else
			 if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2)
			 {
					OC_Count=__HAL_TIM_GET_COMPARE(&htim1,TIM_CHANNEL_2);//获取定时器计数值
					if(GPIO_PIN_RESET == HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_9))
					{
						__HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_2,OC_Count + f2 * Duty_Cycle2);
					}
					else
					{
						__HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_2,OC_Count + f2 * (1 - Duty_Cycle2));
					}	 
			 } 
		 else
			 if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_3)
			 {
					OC_Count=__HAL_TIM_GET_COMPARE(&htim1,TIM_CHANNEL_3);//获取定时器计数值
					if(GPIO_PIN_RESET == HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_10))
					{
						__HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_3,OC_Count + f3 * Duty_Cycle3);
					}
					else
					{
						__HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_3,OC_Count + f3 * (1 - Duty_Cycle3));
					}	 
			 }	
		 else
			 if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_4)
			 {
					OC_Count=__HAL_TIM_GET_COMPARE(&htim1,TIM_CHANNEL_4);//获取定时器计数值
					if(GPIO_PIN_RESET == HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_11))
					{
						__HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_4,OC_Count + f4 * Duty_Cycle4);
					}
					else
					{
						__HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_4,OC_Count + f4 * (1 - Duty_Cycle4));
					}	 
			 }			 
	}
	
}


/* USER CODE END 1 */

(包括增加死区时间效果)
在这里插入图片描述在这里插入图片描述在这里插入图片描述

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

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

相关文章

resty-http库爬虫程序代码示例

lua -- 导入需要的库 local http require "resty.http" local io require "io" -- 创建一个客户端 local client http.new() -- 设置HTTP客户端的 client:set_proxy(proxy_host, proxy_port) -- 执行HTTP GET请求,获取网页内容 local res…

低功耗蓝牙模块在农业技术中的创新应用

农业技术的不断演进对于提高农业生产效率和可持续性至关重要。本文将深入研究低功耗蓝牙模块在农业技术中的创新应用,探讨其在农业传感器网络、智能灌溉系统、畜牧追踪等方面的优势,以推动农业领域向数字化、智能化的方向发展。 随着全球人口的增长和气候…

51综合程序01-DAC转换输出波形

文章目录 DAC转换输出波形使用DA转换输出正弦波,三角波,锯齿波(1)仿真电路图(2)源代码(3)实验结果 DAC转换输出波形 使用DA转换输出正弦波,三角波,锯齿波 &…

如何判断哪种屋顶适合安装光伏板?

随着国家对可再生能源的推广和大力发展,光伏板开始被越来越多人所熟知。而将光伏板安装在家庭楼顶上,不仅可以有效节省土地和楼房面积,还能够为家庭提供更多的经济和环保效益,成为了越来越多人的选择。哪种屋顶适合安装光伏板呢&a…

ESP32-Web-Server 实战编程-通过网页控制设备的 GPIO

ESP32-Web-Server 实战编程-通过网页控制设备的 GPIO 概述 前述博客讲解了 Web 编程的基本知识,包括 HTML、CSS、JavaScript 三个部分,从这节开始,我们进入实战部分,在实际项目中进一步学习 ESP32-Web 编程。 GPIO &#xff08…

leetCode 40.组合总和 II + 回溯算法 + 剪枝 + used数组 + 图解

给定一个候选人编号的集合 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。candidates 中的每个数字在每个组合中只能使用 一次 注意:解集不能包含重复的组合 示例 1: 输入: candidates [10,1,2,7,6,1,5], t…

linux安装minIo(亲测可用)

一、创建文件夹 进入opt文件夹 cd /opt/创建minio文件夹; mkdir minio赋予权限 chmod 777 minio/执行完后查看目录 进到minio文件夹 创建bin目录 mkdir bin创建data目录 mkdir data创建log touch minio.log创建start.sh文件,并写入数据(不会vi或…

搞定这三个问题 伦敦金止损就没问题

笔者多次强调,做伦敦金交易,重要的是风险控制。而止损是我们风险控制中一个很重要的概念。设定好止损,就是风险控制的好开始。下面我们通过三个问题,来解决止损的问题。 问题一,你的止损位在哪里?要做止损&…

多目标水母搜索算法(MOJS)求解微电网优化MATLAB

一、微网系统运行优化模型 微电网优化模型介绍: 微电网多目标优化调度模型简介_IT猿手的博客-CSDN博客 二、多目标水母搜索算法MOJS 多目标水母搜索算法(Multi-Objective Jellyfish Search algorithm,MOJS)由Jui-Sheng Chou等…

软工2021上下午第六题(组合模式)

阅读下列说明和Java代码,将应填入(n)处的字句写在答题纸的对应栏内。 【说明】 层叠菜单是窗口风格的软件系统中经常采用的一种系统功能组织方式。层叠菜单中包含的可能是一个菜单项(直接对应某个功能),也可…

three.js--立方体

使用three.js渲染出可以调节大小的立方体 1.搭建开发环境 1.首先新建文件夹用vsc打开项目终端 2.执行npm init -y 创建配置文件夹 3.执行npm i three0.152 安装three.js依赖 4.执行npm I vite -D 安装 Vite 作为开发依赖 5.根目录下新建index.html 作为页面入口文件 …

一文例说嵌入式 C 程序的内聚和耦合

1 - 原理篇 低耦合,是指模块之间尽可能的使其独立存在,模块之间不产生联系不可能,但模块与模块之间的接口应该尽量少而简单。这样,高内聚从整个程序中每一个模块的内部特征角度,低耦合从程序中各个模块之间的关联关系…

Java基于springboot开发的土特产网站商城多商家源码

主要功能:用户可以浏览特产,按分类和产地搜索,按分类查询特产,搜索店铺,查看评价,加入购物车,下单,查看店铺主页信息特产等店铺内搜索等;用户可申请开通店铺,…

AI伪原创软件-AI伪原创工具下载

在当今数字化时代,创作者们在追求独特创意的同时,也面临着时间和灵感的双重挑战。AI伪原创技术应运而生,为创作者提供了一种快捷而便利的解决方案。本文将专心分享两款备受瞩目的AI伪原创工具,147SEO伪原创、百度文心一言伪原创&a…

夸克大模型助力学术科研提效 四大优势提升知识正确性

当严谨的学术科研与创新的大模型技术结合在一起,会擦出什么样的火花?日前,夸克大模型甫一推出便以优秀的性能成为国产大模型中的“学霸”。在中国科学技术协会近期主办的“大模型应用场景研讨会”上,夸克大模型在快速阅读、创作润…

java开发之个微群聊管理

简要描述: 群管理操作 请求URL: http://域名/operateChatRoom 请求方式: POST 请求头Headers: Content-Type:application/jsonAuthorization:login接口返回 参数: 参数名必选类型说明w…

DCGAN 使用指南:将卷积神经网络和对抗网络结合,适用于生成小尺寸的图像

DCGAN 使用指南:将卷积神经网络和对抗网络结合 网络结构细节设计 论文地址:https://arxiv.org/abs/1511.06434 项目代码:https://github.com/tensorlayer/DCGAN.git DCGAN 适用于生成小尺寸的图像,并且具有简单易用的优势 Styl…

初中古诗文大会填空题的常见题型和阅读专辑的对应知识点分析

前面两篇文章,六分成长为您介绍了2023年初中古诗文大会复选(复赛)单选题和多选题的常见题型和考察点,并且从历年真题和中学生古诗文阅读专辑(初中适用,下称《专辑》)中各选了一些题目作为示例&a…

龙芯loongarch64服务器编译安装maturin

前言 maturin 是一个构建和发布基于 Rust 的 Python 包的工具,但是在安装maturin的时候,会出现如下报错:error: cant find Rust compiler 这里记录问题解决过程中遇到的问题: 1、根据错误的提示需要安装Rust Compiler,首先去其官网按照官网给的解决办法提供进行安装 curl…

C语言进阶指南(11)(指针数组与二维数组)

*欢迎来到博主的专栏——C语言进阶指南 博主id:reverie_ly 文章目录 N级指针指针数组指针数组与二维数组数组指针作为函数的参数 N级指针 指针变量是一个存放地址的变量,在C语言中,每个变量都会有一个地址值。所以指针变量也有一个地址。 …