STM32单片机产生PWM信号

2023-05-16

STM32单片机产生PWM信号

1、开发环境

目标单片机 : STM32F407VET6芯片,系统时钟高达168Mhz
开发平台:KEIL 5
编写程序借助ST公司的标准函数库,不过现在已经不更新这个写函数库了,大部分开发都STM32CubeMX软件直接生成代码使用。但旧的东西(标准函数库)仍然能够使用。

2、目标

PWM称为脉冲宽度调制,可通过修改占空比来控制LED灯的亮度(呼吸灯)

占空比:指在一个脉冲循环的周期内,通电时间相对于总时间所占的比例

配置单片机寄存器来产生PWM

使PA1引脚产生方波,

3、代码

pwm.c文件代码

//TIM5 PWM部分初始化 
//PWM输出初始化
//@arr:自动重装值    
//@psc:时钟预分频数   单片机168MHz经过系统时钟2分频,PWM外设时钟84MHz/(84-1+1)=1MHz 1us 
//功能:由PA1产生占空比50%的方波
void TIM5_PWM_Init(u32 arr,u32 psc)
{		 					 
	GPIO_InitTypeDef GPIO_InitStructure;
	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
	TIM_OCInitTypeDef  TIM_OCInitStructure;
	
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5,ENABLE);  	//TIM5时钟使能    
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); 	//使能PORTA时钟	
	
	GPIO_PinAFConfig(GPIOA,GPIO_PinSource1,GPIO_AF_TIM5); //GPIOA1复用为定时器5
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;           //GPIOA1
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;        //复用功能
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;	//速度100MHz
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;      //推挽复用输出
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;        //上拉
	GPIO_Init(GPIOA,&GPIO_InitStructure);              //初始化PA1
	  
	TIM_TimeBaseStructure.TIM_Prescaler=psc;  //16bit定时器分频   84Mhz/84 = 1MHz   
	TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数模式 1us * 500= 0.5ms溢出时间
	TIM_TimeBaseStructure.TIM_Period=arr;   //自动重装载值
	TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1; //  时钟跳动1/168MHz
	
	TIM_TimeBaseInit(TIM5,&TIM_TimeBaseStructure);//初始化定时器5
	
	//初始化TIM5 Channe2	 
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式1
 	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //输出极性:TIM输出比较极性低
	TIM_OC2Init(TIM5, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM5 2OC1

	TIM_OC2PreloadConfig(TIM5, TIM_OCPreload_Enable);  //使能TIM5在CCR1上的预装载寄存器
 
  	TIM_ARRPreloadConfig(TIM5,ENABLE);//ARPE使能 
	
	TIM_Cmd(TIM5, ENABLE);  //使能TIM5
 
	TIM_SetCompare2(TIM5,arr/2);	//修改比较值,修改占空比50%									  
}  

void main(void)
{
	TIM5_PWM_Init(1000-1,84-1);        //arr=200 5KHz arr=1000 1Kh
	while(1)
	{
	/*什么也不做*/
	}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32单片机产生PWM信号 的相关文章

随机推荐

  • linux 服务器之间文件互传相关命令

    使用scp将一个Linux系统中的文件或文件夹复制到另一台Linux服务器上 一 复制文件 xff1a xff08 1 xff09 将本地文件拷贝到远程 scp 本地文件路径 用户名 64 远程计算机IP或者计算机名称 远程路径 把本地19
  • 【manjaro安装最新的搜狗输入法】2022年1月4号有效测试

    大多数教程都是如下安装 xff1a sudo pacman S fcitx sogoupinyin 但是我的pacman源是没有这个包的 查看yaourt是否有此包 xff1a 21 55 29 steed yaourt Ss fcitx
  • 52单片机设计时钟(串口控制)

    实现目标 单片机时钟正常工作 xff0c 数码管显示时分秒 电脑和单片机串行通信 xff0c 通过电脑串口助手 xff0c 任意修改设置单片机的时钟值 实现的流程框图 运用到的原理有 定时器 计数器 定时器 计数器由高8位和低8位两个寄存器
  • 照片修复-使用Bringing-Old-Photos-Back-to-Life

    项目地址 github项目地址 xff1a https github com microsoft Bringing Old Photos Back to Life 环境搭建 1 下载Bringing Old Photos Back to L
  • cephadm部署分布式ceph存储

    文章目录 一 集群规划系统优化添加yum源挂载本地yum源添加ceph网络yum源添加kernel网络yum源添加docker网络yum源 升级内核部署docker部署时间同步安装ceph引导一个新集群RBD块存储osd 操作打标签监控器调
  • OCR入门教程系列(二):OCR技术发展

    作者简介 CSDN 阿里云人工智能领域博客专家 新星计划计算机视觉导师 百度飞桨PPDE 专注大数据与AI知识分享 公众号 GoAI的学习小屋 免费分享书籍 简历 导图等 更有交流群分享宝藏资料 关注公众号回复 加群 或 链接 加群 专栏推
  • 利用CSS浮动制作一个简易导航栏

    初学CSS 利用CSS浮动和无序列表制作一个简易导航栏 xff1a lt DOCTYPE html gt lt html lang 61 34 en 34 gt lt head gt lt meta charset 61 34 UTF 8
  • ERROR Error: Cannot find module ‘vue-loader-v16/package.json‘ vue3.0安装时的错误

    vue3 0 出来一段时间了 xff0c 一直没机会学 xff0c 现在按照网上的教程安装时居然有报错 xff01 我的解决是 直接把项目里面的node modules和package lock json文件删除了 xff0c 然后在重新执
  • php 树形菜单数据获取

    php 树形菜单数据获取 public function generateTree data condition 61 array if empty condition foreach data as k 61 gt v if in arr
  • go语言编译前端静态文件到可执行文件 -statik

    statik 安装 go get github com rakyll statik statik 使用 1 把安装好的包 里面的 statik go 文件编译好 然后运行 2 编译好的statik go文件 src 61 你的静态文件路径
  • goLand全局修改时区

    两种方法 第一种 xff1a loc 61 time FixedZone 34 UTC 34 8 3600 time Local 61 loc 第二种 loc err 61 time LoadLocation 34 America Atka
  • python之Pyperclip模块

    python之Pyperclip模块 下面介绍一下 xff0c python中的Pyperclip模块 xff0c 它的简单又实用 xff0c 主要用法就2点 xff1a 1 用于复制剪贴板里的内容 2 向剪贴板写入内容 一 Pypercl
  • 利用栈判断一个字符串是否是回文

    利用栈判断一个字符串是否是回文 问题描述 编写一个程序 xff0c 判断一个字符串是否为回文 xff08 顺读和倒读都一样的字符串称为回文 xff09 输入形式 长度小于100的任意字符串 输出形式 如果输入字符串是回文 xff0c 则输出
  • Java把String转换成Date类型(Date转换成String类型)

    1 String转换成Date类型 span class token class name SimpleDateFormat span ft span class token operator 61 span span class toke
  • 微信小程序开发自学笔记 —— 七、性能优化

    性能优化 启动 在小程序启动时 xff0c 微信会为小程序展示一个固定的启动界面 xff0c 界面内包含小程序的图标 名称和加载提示图标 此时 xff0c 微信会在背后完成几项工作 xff1a 下载小程序代码包 加载小程序代码包 初始化小程
  • Error: failed to unmarshal json. invalid character “*”looking for beginning of value解决方案

    IPFS config时出现 Error failed to unmarshal json invalid character looking for beginning of value 在Win10 命令行执行ipfs config命令
  • Jsp的四种作用域范围

    首先要声明一点 xff0c 所谓 34 作用域 34 就是 34 信息共享的范围 34 xff0c 也就是说一个信息能够在多大的范围内有效 JSP的四种范围 xff0c 分别为page request session application
  • go 调用shell命令 两种方式(有无返回值)

    阻塞方式 需要执行结果 适用于执行普通非阻塞shell命令 xff0c 且需要shell标准输出的需要对shell标准输出的逐行实时进行处理的 非阻塞方式 不需要执行结果 官网的标准中文库 阻塞方式 需要执行结果 主要用于执行shell命令
  • linux内核链表应用--笔记

    Windows 应用linux内核链表 一 从网上现在linux kernel代码 linux内核版本有2种 稳定版 次版本为偶数 xff0c 开发版 次版本为奇数 版本号 主版本 次版本 释出版本 修改版本 内核下载连接网站 xff1a
  • STM32单片机产生PWM信号

    STM32单片机产生PWM信号 1 开发环境 目标单片机 STM32F407VET6芯片 xff0c 系统时钟高达168Mhz 开发平台 xff1a KEIL 5 编写程序借助ST公司的标准函数库 xff0c 不过现在已经不更新这个写函数库