PWM实验(控制蜂鸣器,风扇,马达)

news/2024/5/2 19:41:48/文章来源:https://blog.csdn.net/yayyy4/article/details/127148458

cortex-A7核实现PWM对蜂鸣器,风扇,马达的控制

1.PWM概念

        PWM为一种对模拟信号电平进行数字编码的方法,通过高分辨率计数器的使用,方波的占空比被调制用来对一个具体模拟信号的电平进行编码。

        A7核的芯片有控制PWM的脉冲宽度调制定时器,脉冲即为方波信号,高低电平的变化可产生方波信号。周期为高低电平变化所需要的时间,单位为ms,周期和频率之间是倒数关系,频率即为1s时间可以产生多少个方波信号,单位为Hz,占空比为高低电平占整个周期的百分比。可看下图理解

 2.分析扩展板中蜂鸣器,风扇,震动马达对应的电路图,并找到对应的引脚,然后去资源拓展板中查找这几个引脚在资源扩展板上对应的引脚,对应下图可知  马达:TIM16 CH1----->PF6,风扇:TIM1 CH1----->PB13,蜂鸣器:TIM4 CH1----->PB6。

 

 3.分析PWM工作的框图(例:蜂鸣器)

         分析上图可知需要用到RCC寄存器(控制相关控制器组使能),GPIO寄存器(设置为复用功能),TIM4,TIM16,TIM1寄存器(产生特定的方波)

4.分析RCC章节(使GPIO组和TIM组时钟使能)

        a.分析芯片手册2.5.2章节查看需要控制的寄存器在哪些总线上,RCC,GPIO在AHB4总线上,TIM4在APB1总线上,TIM1和TIM6在APB2总线上。

 

        TIM4:

 

         TIM1:

         TIM16:

        b.RCC控制GPIO组使能

         c.RCC控制TIM组使能

 

 5.GPIO章节分析

        a.设置GPIOx_MODER寄存器为复用模式

        设置GPIOB_MODER寄存器的第13位到第12位为10(复用功能模式),此为PB6引脚(蜂鸣器)

        设置GPIOB_MODER寄存器的第27位到第26位为10(复用功能模式),此为PB13引脚(风扇)

        设置GPIOF_MODER寄存器的第13位到第12位为10(复用功能模式),此为PF6引脚(马达)

例:

        b.设置GPIOx_AFRL和GPIOx_AFRH使对应复用功能为对应TIM引脚

        TIM4_CH1在GPIOx_AFRL寄存器上

        TIM1_CH1,TIM16_CH1在GPIOx_AFRH寄存器上

例:

 6.分析TIM章节

        a.通用计时器概述简析:

         b.工作原理

        c.递减计数方式(边沿对齐方式)

        1)驱动递减计数器时钟信号,每来一个时钟周期

        2)技术其中的值减1

        3)如果减到值为0,则从递减计数器初值重启开启下一个时钟周期

        d.定时器工作原理以及如何产生PWM方波

         1)当定时器启动之后,自动重载计数器中的值,会自动加载到递减计数器中

         2)递减计数器在CK_CNT时钟驱动下进行工作

         3)每来一个时钟周期,递减计数器中的值减1

         4)如果减到和比较/捕获寄存器中的值相等之后,电平发生翻转,这样就可以产生PWM方波信息

              

        e.分配器工作原理

        

        f.TIMx_CR1寄存器配置TIM计数器方式

        例(TIM4):

                

                 

         g.分析TIMx_CCMR1寄存器

         例(TIM4):

                

        ​​​​​​​        

 

         h.分析TIMx_CCER寄存器

        例(TIM4):

                

         i.分析TIMx_PSC寄存器

         例(TIM4):

                

         j.分析TIMx_ARR寄存器

        例(TIM4):

                

         k.分析TIMx_CCR1寄存器

        例:

        ​​​​​​​        

         l.马达寄存器的设置

        

         m.风扇寄存器的设置

        

 7.代码编写

  a.pwm.h文件

#ifndef __PWM__H__
#define __PWM__H__#include "stm32mp1xx_gpio.h"
#include "stm32mp1xx_rcc.h"
#include "stm32mp1xx_tim.h"//蜂鸣器初始化 PB6----->TIM4_CH1
void pwm_init();//马达初始化 PF6----->TIM16_CH1
void motor_init();//风扇初始化 PE9----->TIM1_CH1
void fan_init();#endif

 b.pwm.c文件

#include "pwm.h"//蜂鸣器初始化 PB6----->TIM4_CH1
void pwm_init()
{/*********RCC初始化***********///1.使能GPIOB组时钟RCC->MP_AHB4ENSETR |= (0x1 << 1);//2.使能TIM4定时器时钟RCC->MP_APB1ENSETR |= (0x1 << 2);/*********GPIO初始化*********///1.设置PB6引脚为复用功能模式GPIOB->MODER &= (~(0x3 << 12));GPIOB->MODER |= (0x2 << 12);//2.设置PB6引脚复用功能模式TIM4_CH1GPIOB->AFRL &= (~(0xF << 24));GPIOB->AFRL |= (0x2 << 24);/*********TIM4_CH1初始化**********///1.设置分配器 系统提供时钟源209MHZ 209TIM4->PSC = 209-1;	//2.设置PWM方波最终周期TIM4->ARR = 1000;	//3.设置PWM方波占空比TIM4->CCR1 = 700;//4.设置TIM4_CH1通道为PWM1模式TIM4->CCMR1 &= ~((0x1 << 16) | (0x7 << 4));TIM4->CCMR1 |= (0x6 << 4);	//5.设置TIM4_CH1通道为预加载时能TIM4->CCMR1 |= (0x1 << 3);	//6.设置TIM4_CH1通道为输出模式TIM4->CCMR1 &= ~(0x3);	//7.设置TIM4_CH1通道为输出模式极性高电平TIM4->CCER &= ~(0x1 << 1);//8.设置TIM4_CH1通道为比较捕获寄存器输出使能TIM4->CCER |= (0x1 << 0);	//9.设置TIM4_CH1通道自动重载计数器预加载使能TIM4->CR1 |= (0x1 << 7);	//10.边沿对齐TIM4->CR1 &= (~(0x3 << 5));	//11.递减计数TIM4->CR1 |= (0x1 << 4);	//12.计数器使能TIM4->CR1 |= (0x1 << 0);
}//马达初始化 PF6----->TIM16_CH1
void motor_init()
{/*********RCC初始化***********///1.使能GPIOB组时钟RCC->MP_AHB4ENSETR |= (0x1 << 5);//2.使能TIM4定时器时钟RCC->MP_APB2ENSETR |= (0x1 << 3);/*********GPIO初始化*********///1.设置PB6引脚为复用功能模式GPIOF->MODER &= (~(0x3 << 12));GPIOF->MODER |= (0x2 << 12);//2.设置PB6引脚复用功能模式TIM4_CH1GPIOF->AFRL &= (~(0xF << 24));GPIOF->AFRL |= (0x1 << 24);/*********TIM4_CH1初始化**********///1.设置分配器 系统提供时钟源209MHZ 209TIM16->PSC = 209-1;	//2.设置PWM方波最终周期TIM16->ARR = 1000;	//3.设置PWM方波占空比TIM16->CCR1 = 700;//4.设置TIM4_CH1通道为PWM1模式TIM16->CCMR1 &= ~((0x1 << 16) | (0x7 << 4));TIM16->CCMR1 |= (0x6 << 4);	//5.设置TIM4_CH1通道为预加载时能TIM16->CCMR1 |= (0x1 << 3);	//6.设置TIM4_CH1通道为输出模式TIM16->CCMR1 &= ~(0x3);	//7.设置TIM4_CH1通道为输出模式极性高电平TIM16->CCER &= ~(0x1 << 1);//8.设置TIM4_CH1通道为比较捕获寄存器输出使能TIM16->CCER |= (0x1 << 0);	//9.设置TIM4_CH1通道自动重载计数器预加载使能TIM16->BDTR |=0x1 << 15;TIM16->CR1 |= (0x1 << 7);	//10.边沿对齐TIM16->CR1 &= (~(0x3 << 5));	//11.递减计数TIM16->CR1 |= (0x1 << 4);	//12.计数器使能TIM16->CR1 |= (0x1 << 0);
}//风扇初始化 PE9----->TIM1_CH1
void fan_init()
{/*********RCC初始化***********///1.使能GPIOE组时钟RCC->MP_AHB4ENSETR |= (0x1 << 4);//2.使能TIM4定时器时钟RCC->MP_APB2ENSETR |= (0x1 << 0);/*********GPIO初始化*********///1.设置PB6引脚为复用功能模式GPIOE->MODER &= (~(0x3 << 18));GPIOE->MODER |= (0x2 << 18);//2.设置PB6引脚复用功能模式TIM4_CH1GPIOE->AFRH &= (~(0xF << 4));GPIOE->AFRH |= (0x1 << 4);/*********TIM4_CH1初始化**********///1.设置分配器 系统提供时钟源209MHZ 209TIM1->PSC = 209-1;	//2.设置PWM方波最终周期TIM1->ARR = 1000;	//3.设置PWM方波占空比TIM1->CCR1 = 700;//4.设置TIM4_CH1通道为PWM1模式TIM1->CCMR1 &= ~((0x1 << 16) | (0x7 << 4));TIM1->CCMR1 |= (0x6 << 4);	//5.设置TIM4_CH1通道为预加载时能TIM1->CCMR1 |= (0x1 << 3);	//6.设置TIM4_CH1通道为输出模式TIM1->CCMR1 &= ~(0x3);	//7.设置TIM4_CH1通道为输出模式极性高电平TIM1->CCER &= ~(0x1 << 1);//8.设置TIM4_CH1通道为比较捕获寄存器输出使能TIM1->CCER |= (0x1 << 0);	//9.设置TIM4_CH1通道自动重载计数器预加载使能TIM1->BDTR |=0x1 << 15;TIM1->CR1 |= (0x1 << 7);	//10.边沿对齐TIM1->CR1 &= (~(0x3 << 5));	//11.递减计数TIM1->CR1 |= (0x1 << 4);	//12.计数器使能TIM1->CR1 |= (0x1 << 0);}

 main.c文件

#include "pwm.h"
extern void printf(const char *fmt, ...);
void delay_ms(int ms)
{int i,j;for(i = 0; i < ms;i++)for (j = 0; j < 1800; j++);
}int main()
{pwm_init();fan_init();motor_init();while(1){}return 0;
}

 

 

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

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

相关文章

【设计模式】-创建型模式-第2章第4讲-【原型模式】

目录 1、原型模式&#xff08;Prototype Pattern&#xff09;概念 2、浅拷贝与深拷贝 2.1、概念 2.2、Java 中的深浅拷贝 浅拷贝&#xff1a; 深拷贝&#xff1a; 实例 浅拷贝 深拷贝的两种实现方式 方式一 方式二 3、原型模式的优缺点 4、 结尾 1、原型模式&#…

带你一步步分析webpack是如何执行打包产物的

引入关系如图所示&#xff1a; 圈出来文件d是异步导入的文件。 wepback版本如图所示&#xff1a; 执行打包命令&#xff0c;产物如下图&#xff1a; 会生成两个js文件&#xff0c;一个是入口文件打包的testxx.js&#xff0c;还有一个是异步文件d生成的src_d_js.js。 打包后的…

CSS学习298~355(品优购+Web服务器)

1 品优购项目规划 1.1 网站制作流程 我们主要做前台页面设计 1.2 品优购项目整体介绍 项目名称: 品优购项目描述:品优购是一个电商网站,我们要完成PC端首页、列表页、注册页面的制作 1.3 品优购项目的学习目的 电商类网站比较综合,里面需要大量的布局技术,包括布局方式、…

数据结构-复杂度(深入学习版+Java版)

文章目录一、复杂度经典例子分析1、计算时间复杂度分析题1&#xff1a;O(NM)&#xff0c;循环题2&#xff1a;O(N^2)&#xff0c;冒泡排序题3&#xff1a;O(logN)&#xff0c;二分查找题4&#xff1a;O(N)&#xff0c;阶乘递归题5&#xff1a;O(2^N)&#xff0c;斐波那契递归(满…

ffmpeg、ffplay、ffprobe 常用命令详解(音视频必备)

前言&#xff1a; &#x1f604;作者简介&#xff1a;小曾同学.com,小伙伴们也可以叫我小曾&#xff0c;一个致力于测试开发的博主⛽️ 如果文章知识点有错误的地方&#xff0c;还请大家指正&#xff0c;让我们一起学习&#xff0c;一起进步。&#x1f60a; 座右铭&#xff1a;…

回溯算法 - 二叉树中和为某一值的路径 字符串的排列

目录 1.二叉树中和为某一值的路径 1.1 题目描述 1.2 回溯算法的一般步骤 1.3 解题思路 1.4 代码实现 2. 字符串的排列 2.1 题目描述 2.2 解题思路 2.3 代码实现 1.二叉树中和为某一值的路径 1.1 题目描述 输入一颗二叉树的根节点root和一个整数expectNumber&#xff…

华为模拟器ensp学习笔记

CSDN话题挑战赛第2期 参赛话题&#xff1a;学习笔记 目录前言1️⃣如何注册eNSP设备?2️⃣如何通过SecureCRT登录eNSP模拟设备&#xff1f;结语前言 记录华为模拟器使用中遇到的问题 1️⃣如何注册eNSP设备? 如何注册eNSP设备 重新注册AR、WLAN设备&#xff1a; 启动AR时&…

模块化:CommonJS规范

目录 CommonJS规范 模块使用环境区分 核心语法 如何使用 CommonJS&#xff1a;服务器端使用 CommonJS&#xff1a;浏览器端使用 CommonJS规范 模块使用环境区分 CommonJS规范中&#xff0c;每一个JS文件都可以作为一个模块。模块的引入&#xff0c;主要区分两个环境&…

基于Java后台(Springboot框架)+前端小程序(MINA框架)+Mysql数据库的医院预约挂号小程序系统设计与实现

项目背景和意义 目的&#xff1a;本课题主要目标是设计并能够实现一个基于微信小程序医院预约挂号系统&#xff0c;前台用户使用小程序&#xff0c;后台管理使用基JavaMySql技术&#xff1b;通过后台设置医院信息、录入医院科室信息、录入医生信息、设置医生排班信息、查看预约…

(附源码)计算机毕业设计SSM毕业设计管理系统

毕设帮助&#xff0c;指导&#xff0c;本源码分享&#xff0c;调试部署(见文末) 3.3功能需求分析 本系统采用从上往下的步骤开发&#xff0c;基本功能如下&#xff1a; 本课题要求实现一套毕业设计管理系统&#xff0c;系统主要包括&#xff08;管理员&#xff0c;教师和学生&a…

python-pyecharts基础知识

资料来源&#xff1a;2022新版黑马程序员python教程&#xff0c;8天python从入门到精通&#xff0c;学python看这套就够了_哔哩哔哩_bilibili 折线图 地图 动态GDP增长图 补充知识&#xff1a; json 1&#xff09;JSON是一种轻量级的数据交互格式。可以按照JSON指定的格式去…

群晖Docker套件注册Harbor私有镜像仓库,并下载运行自己发布的Docker镜像

[群晖Docker套件注册Harbor私有镜像仓库&#xff0c;并下载运行自己发布的Docker镜像] 在进行微服务开发时&#xff0c;一些基础服务组件&#xff08;Nacos、Redis、Mysql&#xff09;的运行以及越来越多的业务服务组件的开发&#xff0c;会导致开发者电脑的内存资源紧张&#…

Android:玩转Jetpack Compose之MVI架构——基类中使用页面UiState

系列文章目录 架构一&#xff08;MVP&#xff09;&#xff1a;Android:玩转RetrofitOkHttpKotlin协程 网络请求架构 架构二&#xff08;MVVM&#xff09;&#xff1a;Android:玩转网络请求架构 RetrofitKotlin协程简单使用(MVVM架构模式) 架构三&#xff08;MVI&#xff09;&a…

吴恩达machine-learning-specialization2022第1周的optional lab

1. 使用python和numpy实现一个线性回归 要求使用梯度下降法&#xff0c;可视化losslossloss随着迭代次数的变化曲线 2. 说明 2.1 拟合函数 fw,b(x(i))wx(i)bf_{w,b}(x^{(i)})wx^{(i)}bfw,b​(x(i))wx(i)b 2.2 均方误差损失函数 J(w,b)12m∑i0m−1(fw,b(x(i))−y(i))2J(w,b)…

【云原生丨Kubernetes系列15】创建 ConfigMap 资源对象

前言 前⾯我们深入学习了 Servie 的使⽤&#xff0c; Service 是 Kubernetes 系统中⾮常重要的⼀个核⼼概念&#xff0c;这节课我们来学习另外⼀个⾮常重要的资源对象&#xff1a; ConfigMap 文章目录前言引入创建引入 应用部署的一个最佳实践是将应用所需的配置信息与程序进行…

【ML13】overfitting and underfitting 过拟合与欠拟合

过拟合与欠拟合过拟合与欠拟合概念过拟合解决办法解决办法一&#xff1a;在训练集中加入更多数据解决办法二&#xff1a;优化数据集 feature selection解决方法三&#xff1a;正则化 Regularization正则化线性回归Recape of Cost Function of Linear RegressionAdd the regular…

算法刷题:可交换的连续最大和

目录前言1. 题目描述2. 题目分析3. 代码实现4. 运行测试后记前言 好久没有做题了&#xff0c;前两天做了一道题&#xff0c;感觉还比较有意思&#xff0c;来分享一下。想学习&#xff0c;但是自己实在是懒&#xff0c;懒癌怎么治&#xff1f;期待着自己彻底奋发图强那一天。 …

【Ubuntu】常用软件下载与安装汇总

前言 发现很多诸如Detectron2的开源项目官方仅提供Liunx系统的安装方式&#xff0c;于是愤而将工作机系统换成了Ubuntu20.04&#xff0c;下面记录一些常用软件的安装方式&#xff0c;以便再次换机时能快速迁移&#xff0c;后续装新的软件会持续更新。 安装yum 直接安装会报错…

潜伏在ISP网络中数月的新黑客组织“Metador”

研究人员称之为“Metador”的一个以前未知的威胁因素已经入侵电信、互联网服务提供商(ISP)和大学大约两年了。 Metador的目标是中东和非洲的组织&#xff0c;他们的目的似乎是长期坚持间谍活动。该组织使用了两种基于Windows的恶意软件&#xff0c;它们被描述为“极其复杂”&a…

JavaScript:BOM

目录 一、BOM介绍 1、BOM的构成 二、window对象常用方法 1、窗口加载事件 2、window.onresize 3、confirm()方法 4、open()方法 5、setTimeout()定时器 6、this的使用 7、JS是单线程 8、JS执行机制 9、URL 10、location对象的属性 11、document对象 12、Date对象…