SWM181按键控制双通道PWM固定占空比输出

news/2024/7/5 5:14:01

SWM181按键控制双通道PWM固定占空比输出


  • 📌SDK固件包:https://www.synwit.cn/kuhanshu_amp_licheng/

  • 🌼开发板如下图:
    在这里插入图片描述

  • ✨注意新手谨慎选择作为入门单片机学习。目前只有一个简易的数据手册和SDK包,又没有参考手册,就目前的资料来看,数据手册虽然可以帮助到你了解该芯片的外设功能以及相关寄存器介绍,但是SDK包又是使用的库函数,关键是很多都没有注释,也没有相关的库函数手册,一些被定义的结构体参数都不知道控制什么的。

typedef struct {
	__IO uint32_t CLKDIV;
    
	     uint32_t RESERVED[3];
    
	__IO uint32_t FORCEH;
    
    __IO uint32_t ADTRG0A;
    __IO uint32_t ADTRG0B;
    
    __IO uint32_t ADTRG1A;
    __IO uint32_t ADTRG1B;
    
    __IO uint32_t ADTRG2A;
    __IO uint32_t ADTRG2B;
    
    __IO uint32_t ADTRG3A;
    __IO uint32_t ADTRG3B;
    
	     uint32_t RESERVED2[7];
    
	__IO uint32_t HALT;						//刹车控制
    
	__IO uint32_t CHEN;
    
	__IO uint32_t IE;
    
	__IO uint32_t IF;
    
	__IO uint32_t IMSK;
    
	__IO uint32_t IRAWST;
} PWMG_TypeDef;

🎉面对上面的PWMG_TypeDef结构体,除了一个刹车成员参数注明了,我不知道有多少人知道其它参数具体的意思,更别说使用了,这可能是编写代码的人自需要自己知道就可以了。这样的芯片怎么让开发者深入的展开学习和探索。😪,大家都说支持国产芯片,拿什么来支持你,这毕竟不能买来当饭吃,而是要开发才能使用的。 吐槽贵吐槽,既然展开了一页,就自己去翻阅数据手册慢慢找。

📋本案例基于官方SDK案例中的PWM案例和按键控制案例相结合,采用双按键控制:一个按键控制PWM刹车,另一个按键负责启动PWM。

📑SWM181 PWM介绍

  • 4 组 16 位宽 PWM 控制,最多可产生 8 路 PWM 信号
    ⚫ 支持互补、中心对称、单步模式
    ⚫ 提供高电平起始中断及周期结束中断
    ⚫ 支持硬件死区设置
    ⚫ 可选择初始输出电平选择
    ⚫ 支持刹车功能 。
  • PWM 模块提供了 8 路(4 组)输出,支持独立、互补、中心对称等模式,支持死区生
    成及初始电平配置。

📜PWM 模块建议按照如下顺序配置

  • 注意:分频寄存器需要在初始电平设置完成后进行配置。
  • PWM 模块建议按照如下顺序配置:
  1. 配置初始电平
  2. 配置周期及中断相关寄存器
  3. 初始化时钟分频
  4. 引脚功能切换
  5. PWM 使能

刹车与暂停功能

  • PWM 发生器模块支持外部信号输入与内部软件操作对输出进行暂停。
    软件可以通过配置 FORCEH 寄存器,使对应 PWM 通道引脚输出为 1。此时,PWM 模块计数依然继续进行,当禁能该寄存器对应位时,PWM 可继续输出。波形如下图所示:
    在这里插入图片描述
    外部信号可通过 PWM_BREAK 引脚输入指定电平对 PWM 模块进行刹车操作,使用前
  • 🛠配置如下:
    • 配置 PORTCON 模块中 INEN 寄存器使能引脚输入功能
    • 通过 PORT_SEL 寄存器将引脚切换为数字功能
    • 通过 FUNMUX 寄存器将引脚配置为 PWM_BREAK 功能
    • 对 HALT 寄存器进行设置,配置刹车输入有效电平、刹车过程中输出电平、刹车后 PWM 是否继续计数、该功能影响的通道
    • 配置 HALT 寄存器 BIT[0]进行使能。使能后,当外部输入指定电平时,对应通道执行刹车功能
    • 刹车电平恢复后,将根据 HALT 寄存器配置决定 PWM 波形是否继续输出.

寄存器映射

在这里插入图片描述
在这里插入图片描述

📝测试代码

/*
功能说明:在PA4上产生频率600Hz占空比为25%的方波;
在PA5上产生频率600Hz占空比为50%的方波,
PA6为PWM刹车,PA14为重新启动PWM输出

*/

#include "SWM181.h"


int main(void)
{
	PWM_InitStructure  PWM_initStruct;
	
	SystemInit();
	
	PWM_initStruct.clk_div = PWM_CLKDIV_4;		//时钟周期配置F_PWM = 24M/4 = 6M
	
	PWM_initStruct.mode = PWM_MODE_INDEP;		//配置 PWM 输出模式:A路和B路独立输出					
	PWM_initStruct.cycleA = 10000;				//6M/10000 = 600Hz			
	PWM_initStruct.hdutyA =  2500;				//2500/10000 = 25%
	PWM_initStruct.deadzoneA = 10;		//死区
	PWM_initStruct.initLevelA = 1;
	
	PWM_initStruct.cycleB = 10000;//B路周期
	PWM_initStruct.hdutyB =  5000;				//5000/10000 = 50%
	PWM_initStruct.deadzoneB = 10;//B路死区时长,取值0--63
	PWM_initStruct.initLevelB = 1;//B路初始输出电平,0 低电平    1 高电平
	
	PWM_initStruct.HEndAIEn = 0;//A路高电平结束中断使能
	PWM_initStruct.NCycleAIEn = 0;//A路新周期开始中断使能
	PWM_initStruct.HEndBIEn = 0;//B路高电平结束中断使能
	PWM_initStruct.NCycleBIEn = 0;//B路新周期开始中断使能
	
	PWM_Init(PWM1, &PWM_initStruct);
	
	PORT_Init(PORTA, PIN4, FUNMUX_PWM1A_OUT, 0);//端口引脚功能选择
	PORT_Init(PORTA, PIN5, FUNMUX_PWM1B_OUT, 0);
	
	PWM_Start(PWM1, 1, 1);//启动PWM输出
	GPIO_Init(GPIOA, PIN14, 0, 1, 0, 0);			//输入,上拉使能,接KEY
	/* 刹车功能测试 */
#if 1
	PORT_Init(PORTA, PIN6, FUNMUX_PWM_BREAK, 1);//PA6输入使能	
	PWMG->HALT =(1 << PWMG_HALT_EN_Pos) |
				 (1 << PWMG_HALT_PWM1_Pos)    |
				 (1 << PWMG_HALT_STOPCNT_Pos) |
				 (0 << PWMG_HALT_VALIDI_Pos)  |
				 (0 << PWMG_HALT_VALIDO_Pos);	// PWM_BREAK电平位低时,PWM1输出变成低
#endif

	while(1)
	{
				if(GPIO_GetBit(GPIOA, PIN14) == 0)		//按键被按下
		{
		PWM_Start(PWM1, 1, 1);
		}

	}
}

http://lihuaxi.xjx100.cn/news/955269.html

相关文章

如何使用固态继电器实现更高可靠性的隔离和更小的解决方案尺寸

自晶体管发明之前&#xff0c;继电器就已被用作开关。从低压信号安全控制高压系统的能力&#xff0c;如隔离电阻监控&#xff0c;对于许多汽车系统的开发是必要的。虽然机电继电器和接触器的技术多年来有所改进&#xff0c;但设计人员要实现其终身可靠性和快速开关速度以及低噪…

软考论文-成本管理(1)

成本管理 1.成本管理的主要内容&#xff1f; 规划成本&#xff1a;制定一个成本管理的计划。估算成本&#xff1a;根据项目范围说明书&#xff0c;项目管理计划和wbs等文档&#xff0c;采用xxx方法进行估算成本成本预算&#xff1a;可以算工作包的费用&#xff0c;制定预算和…

Ubuntu 18.04 LTS 和 CentOS 7 增加 Swap 空间

注意&#xff1a;随着时间的流逝&#xff0c;其中的信息可能已经有所发展或是发生改变。侵删&#xff01; 文章目录前言环境&#xff1a;使用文件划分swap 分区删除之前的swap文件&#xff08;如果有&#xff09;创建一个swap文件配置为开机自动启用swap 的使用策略前言 由于我…

burp联动xray进行被动扫描

burp联动xray进行被动扫描0、简介1、打开burp&#xff0c;设置转发数据包&#xff0c;将burp抓到的数据包&#xff0c;额外转发到本机的7777端口2、出现这个代表配置成功3、接着在xray里输入这串代码&#xff0c;让xray进行监听本机的7777端口&#xff0c;进行被动扫描&#xf…

用Python自己写一个分词器,python实现分词功能,隐马尔科夫模型预测问题之维特比算法(Viterbi Algorithm)的Python实现

☕️ 本文系列文章汇总&#xff1a; &#xff08;1&#xff09;HMM开篇&#xff1a;基本概念和几个要素 &#xff08;2&#xff09;HMM计算问题&#xff1a;前后向算法 代码实现 &#xff08;3&#xff09;HMM学习问题&#xff1a;Baum-Welch算法 代码实现&#xff08…

树状数组讲解

树状数组 文章目录树状数组引入例题AcWing241.楼兰图腾思路代码AcWing 242. 一个简单的整数问题思路代码AcWing 244. 谜一样的牛思路代码总结引入 树状数组主要维护的是这样一个数据结构&#xff1a; tr[x]表示以x为终点的长度为lowbit(x)的前缀和 对于树状数组主要就两种操作 …

边缘计算开源项目解读——kubeedge mappers实现

0 背景 本文重点解读kubeedge项目中的mapper模块。该模块位于kubeedge的edgecore的南向边缘侧&#xff0c;主要对接入kubeedge的终端设备&#xff0c;进行协议的适配和转换&#xff0c;使其可以和边缘设备通信&#xff0c;转换后的协议是我们前面描述的mqtt协议&#xff0c;当然…

【数据库理论】研究 ANSI/ISO SQL 标准、事务、数据异常与隔离级别

文章目录 一、前言二、简介研究的演进过程三、一致性级别与锁机制3.1 定义 1 :一致性的非正规定义3.2 定义 2 :一致性的锁协议定义3.3 定义 3 :一致性的正式定义四、《ANSI SQL-92 标准》[^1] 定义的现象与隔离级别4.1 ANSI (ISO/IEC) SQL 标准简介4.2 ANSI SQL 定义的现象4…