当前位置: 首页 > article >正文

松瀚-SN8F5703-比较器输出PWM

最近也是让我这个几乎没怎么用过51内核单片机的人享受上了接二连三的需要使用51内核的单片机来开发程序。松瀚的SN8F5700系列单片距今已有十余年的历史但是目前在消费电子这块确实是有不少的使用量。在应用过程中我发现SN8F5073提供的例程中并不包含T2的比较器输出PWM的使用例在互联网上也没简单的搜索到相关内容故在此做一个简单的补充顺带梳理一下有关MCU频率分频和比较器的经典应用。文章附件为我所收集到的松瀚SN8F5700系列有关的开发资源。请注意虽然松瀚支持使用keilC51进行开发但是在安装环境包时请确保你的电脑上不存在多个C51的INT文件并使用keilC51V952及之前的版本。当然如果需要更多的相关资料也可自行前往松瀚的官网www.sonix.com 寻找先看单片机资料我们得知MCU为32M本次开发目标为使用T2的COM(P06)输出指定占空比的PWM波并同步在T2COM3中断中反转P25用以辅助调试。首先我们需要对系统时钟进行配置。CLKSEL 0x06; // Fcpu 32M/2 16M CLKCMD 0X69; CKCON 0X10; // From 8M WDTR 0x5A; // clear watchdog我们得知时钟基准如下所示然后我们需要对使用到的输出I/O进行配置P0 0; P0M 0x40; //P06 设置为输出模式 P0UR 0xFF; P1 0; P1M 0x00; P1UR 0xFF; P2 0; P2M 0x20; //P25设置为输出模式 P2UR 0xFF;这样我们就可以让I/O输出我们想要的高低电平了在这之后则是对TIM2进行配置void InitT2 (void) { //初始化T2 TH2 0x00; TL2 0x00; CRCH 0xFF; CRCL 0xBE; CCH3 0xFF; CCL3 0xFF; //Bit7 1 fcpu/24 bit6 1 TH2/TL2等于CRC时生成中断 //Bit5 0 NA bit4-3 10 设定为自动重新装填 //bit2 0 直接反馈在引脚 bit1-0 01 时钟取决于Bit7 T2CON 0xD1; //bit7-6 10 T2COM3由比较器输出反转电平 //bit5-4 3-2 1-0 分别用00 关闭COM2 COM1 COM0 CCEN 0x80; //bit7 1 T2定时器外部重载中断启动 //bit5 T2定时器COM3中断启动 //其余Bit T2其他中断暂时关闭 IEN1| 0xA0; // Enable total/Timer2 interrupt //bit7 1 所有中断开启 Bit5 T2定时器中断 //bit4 0 UART中断 bit3 T1定时器中断 //bit2 0 外部P0.2(INT1)中断 //bit1 0 T0定时中断 bit0 P20(INT0)中断 IEN0 | 0xA0; }从我们配置以及比较器原理我们可以得知当且仅当TH2/TL2等于CRC时产生中断。我们目标为输出10KHz0~100%占空比的PWM波。此时由于对T2CON的配置T2为时钟的1/24。所以对于CRC和CC3的赋值(HL组成四位的十六进制数0xXXXX)我们可以进行计算定时器分频中断周期所需计数值(10KHz)CRCHCRCL将0xFFBE拆分赋值给CRCH和CRCL即得到CRCH0xFFCRCL0xBE此时PWM周期为100us(即频率10KHz)那么对于占空比而言占空比取决于和CRC比较的计数器CC3(CCH3CCL3)和CRC的比较结果。例如我们让CC3从33开始计数则占空比为50%。那么根据这个原理我们可以得到对于占空比赋值的函数#define RELOAD_VALUE 0xFFBE // 重载固定值 #define PERIOD_COUNTS 66 // 周期计数66(100us1.5us/c1k) float compare_offset 0; uint16_t target_compare 0; extern uint8_t PWMResetFlag 1; /** * brief 设置T2C3PWM占空比(精度0.1 * param duty占空比范围(0.0~100.0)支持小数点后一位(如60.5) * note 本函数不改变PwM频闭(固定1okHz仅修改比较寄存器值 */ void T2C3PWMSet(float duty) { if(PWMResetFlag) { PWMResetFlag 0; //检查是否为有效参数 if(duty 0.0f) {duty 0.0f;} if(duty 100.0f) {duty 100.0f;} //计算目标比较值浮点数运算 compare_offset (duty / 100.0f) * PERIOD_COUNTS; // 四舍五入整数 target_compare (uint16_t)(RELOAD_VALUE compare_offset 0.5f); //防止溢出 if(target_compare 0xFFFF) target_compare 0xFFFF; if(target_compare RELOAD_VALUE) target_compare RELOAD_VALUE; //更新占空比 CCL3 (uint8_t)(target_compare 0xFF); CCH3 (uint8_t)(target_compare 8); PWMResetFlag 1; } }如此以来我们便有了一个能自由设定T2COM3PWM占空比的函数。整个程序则为#define RELOAD_VALUE 0xFFBE // 重载固定值 #define PERIOD_COUNTS 66 // 周期计数66(100us1.5us/c1k) float compare_offset 0; uint16_t target_compare 0; extern uint8_t PWMResetFlag 1; //----------------------------------------------------------------------------- // Function Prototypes //----------------------------------------------------------------------------- void InitT2 (void); //TIM2比较器产生PWM波 void T2C3PWMSet(float duty); //T2COM3占空比值设定 //----------------------------------------------------------------------------- // Main loop //----------------------------------------------------------------------------- void main(void) { CLKSEL 0x06; // Fcpu 32M/2 16M CLKCMD 0X69; CKCON 0X10; // From 8M WDTR 0x5A; // clear watchdog P0 0; P0M 0x40; //P06 P0UR 0xFF; P1 0; P1M 0x00; P1UR 0xFF; P2 0; P2M 0x20; //P25 P2UR 0xFF; InitT2(); while (1) { WDTR 0x5A; // clear watchdog if watchdog enable T2C3PWMSet(40.0); } } void InitT2 (void) { //初始化T2 TH2 0x00; TL2 0x00; CRCH 0xFF; CRCL 0xBE; CCH3 0xFF; CCL3 0xFF; //Bit7 1 fcpu/24 bit6 1 TH2/TL2等于CRC时生成中断 //Bit5 0 NA bit4-3 10 自动重新装填 //bit2 0 直接反应在引脚 bitl-0 01 时钟取决于bit7 T2CON 0xD1; //bit7-6 10 T2COM3比较器输出反转电平 //bit5-4 3-2 1-0 分别对应COM2 COM1 COM0 00关闭 CCEN 0x80; //bit7 1 T2定时器外部重载中断启动 //bit5 T2定时器COM3中断启动 //T2其余bit其他中断暂时关闭 IEN1| 0xA0; // Enable total/Timer2 interrupt IEN0 | 0xA0; } void T2C3PWMSet(float duty) { if(PWMResetFlag) { PWMResetFlag 0; //检查是否为有效参数 if(duty 0.0f) {duty 0.0f;} if(duty 100.0f) {duty 100.0f;} //计算目标比较值浮点数运算 compare_offset (duty / 100.0f) * PERIOD_COUNTS; // 四舍五入整数 target_compare (uint16_t)(RELOAD_VALUE compare_offset 0.5f); //防止溢出 if(target_compare 0xFFFF) target_compare 0xFFFF; if(target_compare RELOAD_VALUE) target_compare RELOAD_VALUE; //更新占空比 CCL3 (uint8_t)(target_compare 0xFF); CCH3 (uint8_t)(target_compare 8); PWMResetFlag 1; } } void T2Interrupt(void) interrupt ISRTimer2 //0x2B { //TF2/TF2RL clear by software if ((IRCON 0x40) 0x40) { IRCON 0xBF; //Clear TF2 } if ((IRCON 0x80) 0x80) { IRCON 0x7F; //Clear TF2RL } } void T2COM3Interrupt(void) interrupt ISRCom4 //0x6B { //TF2C3 clear by hardware P25 ~P25; }单片机上电运行后我们可以观测到P06(黄线C1)输出40%正占空比的PWM,P25(粉线C2)每100us反转一次电平。由于硬件电路设计我这里P06电平是反转的故实际为40%负占空比的PWM波。以上是松瀚SN8F5703利用T2比较器输出指定频率和占空比PWM波的完整代码。相关原理和实现步骤已详细说明如需调整频率或占空比参数可参考代码中的对应设置。

相关文章:

松瀚-SN8F5703-比较器输出PWM

最近也是让我这个几乎没怎么用过51内核单片机的人享受上了,接二连三的需要使用51内核的单片机来开发程序。 松瀚的SN8F5700系列单片距今已有十余年的历史,但是目前在消费电子这块确实是有不少的使用量。在应用过程中,我发现SN8F5073提…...

VSCode+SSH连接树莓派避坑指南:从权限配置到防火墙设置(2023最新版)

VSCodeSSH高效连接树莓派全流程实战:权限优化与网络调优 每次在树莓派上调试代码时,你是否也厌倦了反复插拔显示器和键盘?作为嵌入式开发者的日常工具,树莓派通过SSH远程连接能极大提升工作效率。但现实往往充满意外——权限错误、…...

MATLAB 智能计算全栈实战:基础编程→统计分析→机器学习→深度学习→前沿模型与可解释性

第一章、MATLAB基础编程1、MATLAB 基础操作:包括矩阵操作、逻辑与流程控制、函数与脚本文件、基本绘图等2、文件导入:mat、txt、xls、csv、jpg、wav、avi等格式3、MATLAB编程习惯、编程风格与调试技巧4、MATLAB数字图像处理入门5、案例讲解:基…...

快马平台快速搭建医院预约挂号系统原型,验证核心业务流程

最近在做一个医院预约挂号系统的原型验证,团队想快速跑通从用户挂号到支付的核心流程,看看业务逻辑上有没有坑。如果按传统开发流程,光前后端环境搭建、基础功能开发就得一两周,时间根本耗不起。好在发现了InsCode(快马)平台&…...

基于COMSOL的激光抛光熔池流动数值模拟研究

基于comsol的激光抛光熔池流动数值模拟,动网格方法,考虑马兰戈尼对流,表面张力,重力及浮力,一、引言随着科技的发展,激光抛光技术已经成为现代制造领域中一种重要的表面处理技术。在这一过程中,…...

解锁3大智能引擎:League Akari革新英雄联盟对战体验

解锁3大智能引擎:League Akari革新英雄联盟对战体验 【免费下载链接】League-Toolkit 兴趣使然的、简单易用的英雄联盟工具集。支持战绩查询、自动秒选等功能。基于 LCU API。 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit 价值定位&#xf…...

量子计算商业化时代:2026年量子科技品牌建设的五大设计法则

2026年,量子计算正式迈入商业化爆发的关键拐点——政府工作报告将量子科技列为未来产业,全球量子产业产值加速向万亿级跨越,量子计算不再是实验室里的“炫技”,而是逐渐渗透到生物医药、金融科技、新材料研发等千行百业的核心生产…...

Tao-8k性能调优指南:GPU显存优化与推理加速参数详解

Tao-8k性能调优指南:GPU显存优化与推理加速参数详解 你是不是也遇到过这种情况:好不容易把Tao-8k这样的大模型部署起来,结果一跑推理,要么显存直接爆掉,要么生成速度慢得像蜗牛爬,眼睁睁看着昂贵的GPU资源…...

工程伦理实践指南:从理论到案例的全面解析

1. 工程伦理的核心挑战:技术成功与生态责任的平衡 我第一次接触工程伦理这个概念,是在参与一个化工项目时。当时团队开发的新型材料在实验室表现完美,各项技术指标都远超行业标准。但在投产前的环境影响评估中,我们发现其降解产物…...

小白程序员必看:轻松入门大模型核心技术Transformer(收藏版)

Transformer作为机器学习领域的重要技术架构,是ChatGPT、GPT-4等大语言模型的基础。本文从高层视角解释Transformer的工作原理,不依赖代码与数学公式,避免晦涩的专业术语,帮助读者直观理解其功能与实现方式,包括输入处…...

WordPress AI 虚拟评论插件:拒绝冷场!一键开启“爆款流量”氛围感,转化率直接翻倍!

做站的兄弟,你是否有过这种尴尬? 辛辛苦苦搬运的硬核教程,发布半个月点击过千,评论区却冷冷清清“零互动”? 用户点进来一看评论区是空的,心里立马犯嘀咕:“这资源靠谱吗?有人买过吗…...

java中遍历map里面的键值对

代码示例&#xff1a;import java.util.HashMap; import java.util.Map;public class MapEntryDemo {public static void main(String[] args) {// 1. 创建一个Map&#xff08;字典&#xff09;Map<String, Integer> scoreMap new HashMap<>();scoreMap.put("…...

探索MMC在低频工况下的运行与电容电压波动抑制

MMC运行于低频工况 采用 高频正弦注入方法 抑制子模块电容电压波动 模块化多电平变换器 MATLAB2021b仿真可多种低频率运行低 低频运行双闭环控制 双正弦波注入/双方波注入/混合注入法等 子模块低频波动抑制方法在电力电子领域&#xff0c;模块化多电平变换器&#xff08;MMC&am…...

科晶生物双擎AI驱动,解锁“蛋白/核酸”大分子定向设计新范式

在创新药发现、合成生物学及基因调控等前沿研究中&#xff0c;寻找能与特定靶标&#xff08;蛋白质或复杂核酸分子&#xff09;高特异性、高亲和力结合的多肽&#xff0c;是推进项目的核心环节。然而&#xff0c;传统的实验突变筛选往往耗时长、成本高&#xff0c;且犹如“大海…...

每月那场最难开的汇报会,亿信ABI是怎么解的

月末那两天&#xff0c;企业里最忙的不是业务&#xff0c;是数据部门。财务在核账&#xff0c;销售在对指标&#xff0c;HR在汇总人力成本&#xff0c;营销在拉ROI报表——每个部门都在各自的系统里导数据&#xff0c;各自的Excel里拼表格&#xff0c;然后把最终结果汇到一个人…...

Openclaw一周烧掉我14亿Token后,我总结了这10条血泪教训

一开始我以为&#xff0c;装个OpenClaw&#xff0c;丢给它几个任务&#xff0c;然后让它自己跑就完事了。演示视频里就是这么讲的。但前两周根本不是这么回事。 前两周简直就是"带娃"——盯着它烧token&#xff0c;看着它在同一个答案上循环八次&#xff0c;看着Code…...

讯维音视频分布式控制系统:打造智慧会议室的沉浸式体验

现代高端会议室不仅需要清晰的音画质&#xff0c;更需要智能化、便捷化的管控体验。成都讯维推出的音视频分布式控制系统&#xff0c;以AI赋能为核心&#xff0c;将分布式节点、软件KVM、智能中控融为一体&#xff0c;为企业用户打造高效、智能、安全的会议新生态。一、智能会议…...

一个 GitHub Issue 标题如何让 4000 台电脑沦陷?

此系列并非原文的死板翻译&#xff0c;而是我经过理解和提炼后的输出。仅聚焦其中最有意思和有价值的部分。想了解所有细节的小伙伴&#xff0c;可以去原文查看完整内容。 试想一下&#xff1a;你只是像往常一样打开电脑写代码&#xff0c;但你的 npm publish token 却已经被黑…...

经理结算记录分页

接口说明接口路径方法说明/manager/community-manager/settle-record/pageGET获取社区经理结算记录分页请求参数 支持以下筛选条件&#xff08;来自 CommunityManagerSettleRecordPageReqVO&#xff09;&#xff1a;参数类型说明settlementTypeInteger结算类型&#xff1a;1-日…...

集成产品知识库,AI自动应答+人工无缝衔接的全渠道微信智能客服系统源码

温馨提示&#xff1a;文末有资源获取方式在数字化服务时代&#xff0c;企业客户服务面临724小时响应、多渠道整合与智能化升级的多重挑战。本文将介绍一款基于PHP原创开发的全渠道微信智能客服系统源码&#xff0c;它深度融合AI自动应答与人工客服&#xff0c;内置完善的产品知…...

金智维Ki-Agent平台如何打造“会思考”的数字员工?

当数字员工从“机械执行指令”的工具&#xff0c;升级为“能自主决策、可主动协作”的“硅基伙伴”&#xff0c;企业自动化便迈入了全新阶段。区别于市面上“伪智能”数字员工&#xff0c;金智维立足十余年企业级自动化技术沉淀&#xff0c;以受监督智能体&#xff08;Supervis…...

COMSOL专业模型在激光熔覆与选区熔融仿真中的应用

COMSOL专业模型&#xff5c;激光熔覆/选区熔融仿真&#xff5c;生死单元活化技术/单道多层 专业级COMSOL模型&#xff1a; - 激光熔覆&#xff08;Laser Cladding&#xff09; - 激光选区熔融&#xff08;SLM&#xff09; - 集成生死单元&#xff08;Element Birth and Death&a…...

深度剖析SWAP模型,从SWAP模型源代码编译到AI大语言模型辅助建模

SWAP模型是由荷兰瓦赫宁根大学开发的先进农作物模型&#xff0c;它综合考虑了土壤-水分-大气以及植被间的相互作用&#xff1b;是一种描述作物生长过程的一种机理性作物生长模型。它不但运用Richard方程&#xff0c;使其能够精确的模拟土壤中水分的运动&#xff0c;而且耦合了W…...

sdut-python-实验二-程序流程控制(1-10)

7-1 sdut-sel-10 直角坐标系象限判断 分数 10 作者 周雪芹 单位 山东理工大学 X是一个喜欢数学的小孩&#xff0c;现在刚刚学了坐标系。象限划分示意图如下&#xff1a; 他想知道点(X,Y)在第几象限内。输入数据保证点不在坐标轴及原点上。 输入格式: 多组输入。 每组输入…...

# 金丝雀发布实战:用 Go 实现渐进式流量灰度部署在微服务架构日益普及的今天,**如何安全、可控地发布新版

金丝雀发布实战&#xff1a;用 Go 实现渐进式流量灰度部署 在微服务架构日益普及的今天&#xff0c;如何安全、可控地发布新版本代码成为每个 DevOps 团队的核心挑战。传统的“全量发布”模式风险高、回滚慢&#xff0c;而金丝雀发布&#xff08;Canary Release&#xff09;则提…...

贵州棒球特长生认证路径·棒球1号位联盟

&#x1f50d; 解锁贵州棒球特长生认证路径 | Ultimate Guide to Baseball Certification in Guizhou⛰️ 当中国棒球1号位联盟WBC碰撞贵州山地&#xff01;由棒球1号位MAC矩阵KOL专业解析1️⃣ ⚾ 国际标准 本土落地&#xff1a;Why认证体系至关重要&#xff1f;世界棒球经典…...

知识付费SaaS选型攻略:为何创客匠人成为行业首选

在知识付费行业快速发展、从业者变现需求日益精细化的当下&#xff0c;市面上知识付费SaaS平台品类繁多&#xff0c;功能参差不齐、服务深浅不一、定价套路各异&#xff0c;让个人IP、中小培训机构乃至大型教育企业陷入选型难题。而创客匠人凭借多年行业深耕、全链路闭环服务和…...

“35岁红线”终于松了!多所高校官宣:45岁博士仍可进编

原文来源&#xff1a;GZ号【欧亚科睿学术】长期以来&#xff0c;博士毕业求职常被一条无形的“年龄线”所束缚&#xff0c;尤其是“35岁门槛”让许多人倍感压力。然而&#xff0c;随着人才观念的更新与政策环境的优化&#xff0c;一场关于“年龄”的破冰行动正在悄然推进。近期…...

华为OLT智能管理工具:图形化配置替代命令行,零代码完成开局部署

温馨提示&#xff1a;文末有联系方式华为OLT智能管理工具&#xff1a;告别命令行&#xff0c;实现图形化高效配置 华为OLT智能管理工具是一款面向网络工程师与运维人员的轻量化辅助平台&#xff0c;彻底摆脱传统CLI命令依赖&#xff0c;通过直观的Web界面完成全部核心配置任务&…...

顶流集结,分享出海实战真经!出海大会终极剧透!

出海&#xff0c;早已不是一道选择题&#xff0c;而是一道必答题。现在关键是&#xff1a;出去之后&#xff0c;怎么把本地业务做深、做透&#xff1f;不是表面功夫&#xff0c;而是合规到位、业务扎根&#xff0c;最后能产生实实在在的收益。2026亚马逊云科技出海大会&#xf…...