(PWM呼吸灯)合泰开发板HT66F2390-----点灯大师

前言

上一篇文章相信大家已经成为了点灯高手了,那么进阶就是成为点灯大师 实现PWM呼吸灯
接下来就是直接的代码讲解了,不再讲PWM原理的
这里部分内容参考了另一个博主的文章
合泰杯——合泰单片机工程7之PWM输出

如果有小伙伴不理解引脚设置和delay函数生成或者环境配置的可以浏览上一章内容
合泰杯开发板HT66F2390入门教程(点亮LED灯)——获得成就:点灯大师
本文中会讲解代码为什么要这样配置寄存器和引脚才可以制作呼吸灯(内容可能不完整,持续更新)

代码

#include "HT66F2390.h" 
const int Period = 4095;        // 定义PWM周期为4095
void setLED_PWM(unsigned long Duty);
void delay(unsigned long count); // 声明延时函数
void PWM_Init(void);
void main()
{
	_wdtc=0b10101011;  //关闭看门狗
	int i=0;
	PWM_Init();
	while(1)
	{	
		for(i=0;i<Period;i++)
		{
			delay(50);
			setLED_PWM(i);
		}
		for(i=Period;i>0;i--)
		{
			delay(50);
			setLED_PWM(i);  
		}			
	}
}

void delay(unsigned long count)  //延时10us级别
{
    volatile unsigned long i;
    for(i=0;i<count;i++)
        asm("nop");
}

void setLED_PWM(unsigned long Duty)
{
   	_ptm3ah =Duty/256;      //占空比设置
   	_ptm3al =Duty%256;
}

void PWM_Init(void){
	_ptm3c0=0b00001000;	   //时钟选择为8MHz/4
    _ptm3c1=0b10101000;    //功能选择寄存器,选择PWM输出且低有效
    _ptm3rph=Period/256;    //周期设置,写入CCRP的两个寄存器之中这个是把16位的数据划分成高8位和低8位
    _ptm3rpl=Period%256;
    _pds1=0b00000010;       //PTP3引脚选择,接的是D4
    _emi=1;                //开启总中断
}

代码讲解

学过PWM的同学都能理解呼吸灯的原理,同样,本文中的呼吸灯原理就是通过配置HT66F2390中周期型TM寄存器实现PWM控制,这里就不对PWM原理进行讲解了

可以打开该芯片的数据手册
合泰官方HT66F2390数据手册

我们要使用PWM的话,想一想肯定和定时器有关,那么我们能就翻开数据手册找到定时器有关的内容
在旁边的目录就能找到
在这里插入图片描述

如图,我们发现了PWM的身影,那么就接着往下看看
在这里插入图片描述

这里我们看到了PTM的输出引脚,其中的数字代表的不同引脚类型,后面有说(本文章使用的PTM,如果你要使用STM也是差不多的思路)那这个时候我们就又要跳到PTM相关的内容了

在这里插入图片描述

这个时候我们发现上面的数字PTPn很有可能就是代表下面的n,然后又可以发现n=0~1是10-bit,n=2和3是16-bit的,我们选择16位所以选择n为2或者3
接着往下看这些寄存器代表什么意思

在这里插入图片描述

那我们就可以发现这些寄存器是配置计数器,周期和占空比之类的
最重要的是下面这两个寄存器
PTMnC0和PTMnC1,n的数值代表多少位的计数器

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
那么看到这里,我想用n = 3(16位计数器),PWM输出高有效,那么是不是就把这两个寄存器配置为,如果是你要10位n=1的话就是_ptm1c0 = 0bxxxxxxxx;

    _ptm3c0=0b00001000;	   //时钟选择为8MHz/4
    _ptm3c1=0b10101000;    //功能选择寄存器,选择PWM输出且高有效

然后周期和占空比也知道怎么配置了,也是同理配置寄存器

    _ptm3rph=Period/256;    //周期设置,写入CCRP的两个寄存器之中这个是把16位的数据划分成高8位和低8位
    _ptm3rpl=Period%256;    
   	
   	_ptm3ah =Duty/256;      //占空比设置
   	_ptm3al =Duty%256;

然后我配置了寄存器但是我要知道怎如何使用他,他是哪个引脚呢,那么就需要回到前面这个图了
在这里插入图片描述
我们选择的n = 3,那么就是输出引脚为PTP3,我们接下来看看这个HT66F2390芯片的引脚图

在这里插入图片描述

我们发现他有两个引脚的复用都是PTP3,那么说明这两个引脚都可以使用PWM功能,接下来就是需要知道怎么配置复用功能引脚了
例如我要用PD4就去设置复用功能

在这里插入图片描述
这里如果你想用PB2也是一样的意思,找到PBS1或这PBS0看看

最终我们的初始化PWM代码就可以有下面的部分,我这里是n=3,PD4引脚

void PWM_Init(void){
	_ptm3c0=0b00001000;	   //时钟选择为8MHz/4
    _ptm3c1=0b10101000;    //功能选择寄存器,选择PWM输出且低有效
    _ptm3rph=Period/256;    //周期设置,写入CCRP的两个寄存器之中这个是把16位的数据划分成高8位和低8位
    _ptm3rpl=Period%256;
    _pds1=0b00000010;       //PTP3引脚选择,接的是D4
    _emi=1;                //开启总中断
}

设置占空比

void setLED_PWM(unsigned long Duty)
{
   	_ptm3ah =Duty/256;      //占空比设置
   	_ptm3al =Duty%256;
}

最后一个也是关键的内容
在这里插入图片描述
这里就可以说明为什么我们的代码是这样的了,这里的delay参数是10us

const int Period = 4095;        // 定义PWM周期为4095
	while(1)
	{	
		for(i=0;i<Period;i++)
		{
			delay(50);
			setLED_PWM(i);
		}
		for(i=Period;i>0;i--)
		{
			delay(50);
			setLED_PWM(i);  
		}			
	}

结果演示

PWM呼吸灯演示视频

总结

这个也是最近学习的内容,网上的详细教程也比较少,最后也是自己看着别人的例程对着数据手册写出来的,所以打算自己写一个完整的阅读数据手册配置寄存器完成指定目的的思路,这也大大提升了我阅读数据手册的能力,加下来学习其他的功能我也会继续更新我自己的学习的内容和教程

如果有错误的地方或者需要改进的地方欢迎大家指出!

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

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

相关文章

【C++干货基地】C++:函数重载(深度解析Windows和Linux下函数的修饰规则)

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 引入 哈喽各位铁汁们好啊&#xff0c;我是博主鸽芷咕《C干货基地》是由我的襄阳家乡零食基地有感而发&#xff0c;不知道各位的…

数据分析案例-社交媒体情绪数据集可视化分析(文末送书)

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

C++-带你走进多态(1)

1. 多态的概念 1.1 概念 多态的概念&#xff1a;通俗来说&#xff0c;就是多种形态&#xff0c;具体点就是去完成某个行为&#xff0c;当不同的对象去完成时会产生出不同的状态。 举个栗子&#xff1a;比如买票这个行为&#xff0c;当普通人买票时&#xff0c;是全价买票&am…

Win10系统C盘突然爆满的解决方法

在Win10电脑操作中&#xff0c;用户发现系统C盘突然爆满了&#xff0c;电脑运作变得卡顿&#xff0c;非常影响自己的使用体验&#xff0c;但不知道怎么操作才可以解决问题&#xff1f;接下来小编给大家带来Win10系统C盘突然爆满的解决方法&#xff0c;帮助大家解决问题&#xf…

qt5与qt6的cmake区别

文章目录 使用cmake构建qt项目&#xff0c;坑很多。一是本身就麻烦&#xff0c;二是&#xff0c;确实坑&#xff0c;因为不同的qtcreator版本&#xff0c;选了不同的kits&#xff08;套件&#xff09; 生成的CMakeList.txt文件也不一样。 如果可以的话都选择Qt6的相关选项&…

135 Linux 系统编程11 ,linux命令重定向,dup 和dup2,fcntl实现dup ,进程和程序,虚拟内存和物理内存映射关系,pcb进程块详解

一 linux 命令中重定向&#xff0c;使用>实现 通过 大于号 将前面的内容写入到某一个地方 cat main.c > b.txt //cat main 本身的意思是 显示main.c的值&#xff0c;后面加上 > b.txt 会将显示在屏幕上的字符全部写到b.txt中 例子&#xff1a;将 ls -l 的内容 通…

基于springboot实现二次元商品购物系统项目【项目源码+论文说明】

基于springboot实现二次元商品购物系统演示 摘要 时代的变化速度实在超出人类的所料&#xff0c;21世纪&#xff0c;计算机已经发展到各行各业&#xff0c;各个地区&#xff0c;它的载体媒介-计算机&#xff0c;大众称之为的电脑&#xff0c;是一种特高速的科学仪器&#xff0…

RV32/64 特权架构 - 特权模式与指令

RV32/64 特权架构 - 特权模式与指令 1 特权模式2 特权指令2.1 mret&#xff08;从机器模式返回到先前的模式&#xff09;2.2 sret&#xff08;从监管模式返回到先前的模式&#xff09;2.3 wfi&#xff08;等待中断&#xff09;2.4 sfence.vma&#xff08;内存屏障&#xff09; …

什么是负载均衡集群?

目录 1、集群是什么&#xff1f; 2、负载均衡集群技术 3、负载均衡集群技术的实现 4、实现效果如图 5、负载均衡分类 6、四层负载均衡&#xff08;基于IP端口的负载均衡&#xff09; 7、七层的负载均衡&#xff08;基于虚拟的URL或主机IP的负载均衡) 8、四层负载与七层…

C语言————结构体

接下来我们来了解C语言中很重要的内容&#xff1a;结构体。虽然到现在我们可以创建常量&#xff0c;变量&#xff0c;数组&#xff0c;但是存储的都是相同类型的数据&#xff0c;如果我们需要写入不同数据类型的信息怎么办&#xff0c;例如常见的身份证上的信息&#xff0c;有身…

进程间通信,无名管道pipe,有名管道mkfifo,信号的基础概念,signal函数

我要成为嵌入式高手之2月28日Linux高编第十一天&#xff01;&#xff01; 学习笔记 进程间通信 总共6种通信方法&#xff0c;主要是前五种方式 第一种方式&#xff1a;管道 一、无名管道 只能用于具有亲缘关系的进程间通信 pipe #include <unistd.h> int pipe(i…

ETH开源PPO算法学习

前言 项目地址&#xff1a;https://github.com/leggedrobotics/rsl_rl 项目简介&#xff1a;快速简单的强化学习算法实现&#xff0c;设计为完全在 GPU 上运行。这段代码是 NVIDIA Isaac GYM 提供的 rl-pytorch 的进化版。 下载源码&#xff0c;查看目录&#xff0c;整个项目…

2024年3月5-7日第12届生物发酵技术装备展-奥博仪表

参观企业介绍 潍坊奥博仪表科技发展有限公司成立于2002年3月&#xff0c;注册资金1000万元&#xff0c;已有20多年的发展历程&#xff0c;是一家专业从事流量仪表开发、生产与测控系统集成的高新技术企业和双软认证企业。 目前公司以仪表、通讯产品、自控系统、软件的研发、生…

DVWA 靶场之 Command Injection(命令执行)middlehigh

对于 middle 难度的 我们直接先看源码 <?phpif( isset( $_POST[ Submit ] ) ) {// Get input$target $_REQUEST[ ip ];// Set blacklist$substitutions array(&& > ,; > ,);// Remove any of the characters in the array (blacklist).$target str_rep…

Pytest教程:一种利用 Python Pytest Hook 机制的软件自动化测试网络数据抓包方法

随着计算机技术的发展&#xff0c;使得网络应用的数量不断增加&#xff0c;因此网络数据抓包成为了网络应用开发和测试中非常重要的一部分。目前&#xff0c;已有许多网络数据抓包工具可供使用&#xff0c;例如 Wireshark、Tcpdump、Fiddler 等&#xff0c;但这些工具需要手动配…

5G网络频谱划分与应用

频率越大&#xff0c;波长越短。补充&#xff1a;微波频段&#xff1a;300MHZ~3000GHZ。 5G网络工作频带与带宽配置 &#xff08;1&#xff09; FR1:410MHZ~7125MHZ。 FR2&#xff1a;24250MHZ~52600MHZ 注&#xff1a;早期将6GHZ已下频段作为FR1&#xff0c;但是最新的频段…

Python打发无聊时光:10.用flask创造按键控制的网页小游戏

游戏介绍: 《秦蓝大冒险》是一款简单而紧张的追逐游戏。在这个游戏中&#xff0c;玩家将控制一名名叫“吕千”的角色&#xff0c;试图在一个封闭的空间内逃避一个名为“秦蓝”的追逐者。随着时间的推移&#xff0c;“秦蓝”会不断追踪玩家的位置&#xff0c;努力捕捉到他。 游…

C语言中如何进行内存管理

主页&#xff1a;17_Kevin-CSDN博客 收录专栏&#xff1a;《C语言》 C语言是一种强大而灵活的编程语言&#xff0c;但与其他高级语言不同&#xff0c;它要求程序员自己负责内存的管理。正确的内存管理对于程序的性能和稳定性至关重要。 一、引言 C 语言是一门广泛使用的编程语…

2.1_6 线程的实现方式和多线程模型

文章目录 2.1_6 线程的实现方式和多线程模型&#xff08;一&#xff09;线程的实现方式&#xff08;1&#xff09;用户级线程&#xff08;2&#xff09;内核级线程 &#xff08;二&#xff09;多线程模型&#xff08;1&#xff09;一对一模型&#xff08;2&#xff09;多对一模…

stable diffusion webUI之赛博菩萨【秋葉】——工具包新手安裝与使用教程

stable diffusion webUI之赛博菩萨【秋葉】——工具包新手安裝与使用教程 AI浪潮袭来&#xff0c;还是学习学习为妙赛博菩萨【秋葉】简介——&#xff08;葉ye&#xff0c;四声&#xff0c;同叶&#xff09;A绘世启动器.exe&#xff08;sd-webui-aki-v4.6.x&#xff09;工具包安…