中颖51芯片学习9. PWM(12bit脉冲宽度调制)

news2024/11/27 4:27:29

中颖51芯片学习9. PWM(12bit脉冲宽度调制)

  • 一、资源简介
  • 二、PWM工作流程
  • 三、寄存器介绍
    • 1. PWMx控制寄存器PWMxCON
    • 2. PWM0周期寄存器PWM0PH/L
    • 3. PWM1周期寄存器PWM1PH/L
    • 4. PWM0占空比控制寄存器PWM0DH/L
    • 5. PWM1占空比控制寄存器 PWM1DH/L
    • 6. 占空比寄存器与周期关系
  • 四、代码实现示例
    • 1. 基本功能
    • 2. 封装PWM函数
      • (1)pwm_utils.c
      • (2)main.c

本文使用的芯片型号为 SH79F9476

一、资源简介

前面介绍了使用 SH79F9476 的可编程计数器阵列 PCA0 生成PWM波,其支持8位、16位脉宽调制。
主要特性如下:

  1. 两路12位PWM模块:SH79F9476提供了两个PWM模块,每个模块可以生成具有可调周期和占空比的脉宽调制波形。

  2. 周期溢出中断:每个PWM周期都提供了溢出中断功能,可以在周期结束时触发中断处理程序。

  3. 输出极性可选择:可以通过设置PWM控制寄存器来选择PWM输出的极性,从而决定占空比期间输出的电平。

  4. PWM模块控制:使用PWM控制寄存器(PWMxCON)可以配置PWM模块的时钟源、输出极性、周期中断等参数。

  5. 周期设置:使用PWM周期寄存器(PWMxPH/L)可以设置PWM输出波形的周期,以控制脉冲的频率。

  6. 占空比设置:使用PWM占空比寄存器(PWMxDH/L)可以设置PWM输出波形的占空比,以控制脉冲的宽度。

二、PWM工作流程

SH79F9476的PWM工作流程如下:

  1. 选择PWM模块时钟源
    在开始配置PWM模块之前,首先需要选择PWM模块的时钟源。可以通过设置PWM控制寄存器(PWMxCON)中的PWMxCK[2:0]位来选择时钟源,以确定PWM模块的工作时钟频率。

  2. 设置PWM周期
    使用PWM周期寄存器(PWMxPH/L)设置PWM输出波形的周期。这些寄存器用于控制PWM脉冲的频率。在设置周期之前,需要确定所需的PWM输出频率,并根据所选的时钟源来计算周期寄存器的值。

  3. 设置PWM占空比
    使用PWM占空比寄存器(PWMxDH/L)设置PWM输出波形的占空比。这些寄存器用于控制PWM脉冲的宽度。在设置占空比之前,需要确定所需的PWM输出占空比,并根据所选的周期来计算占空比寄存器的值。

  4. 选择PWM输出模式
    使用PWM控制寄存器(PWMxCON)中的PWMxS位选择PWM输出模式。可以选择PWM占空比期间输出高电平还是低电平。

  5. 使能PWM模块
    设置PWM使能位(PWMxEN)来启用所需的PWM模块。这将启动PWM输出并使其按照设置的周期和占空比工作。

  6. 修改周期和占空比(可选)
    在PWM输出允许期间,可以根据需要修改周期和占空比寄存器的值。修改后的值将在下一个PWM周期开始生效。

  7. 处理PWM周期中断(可选)
    如果启用了PWM周期中断,当PWM周期结束时,将触发中断处理程序。可以在中断处理程序中执行相应的操作,例如更新周期和占空比等。

  8. 调整PWM输出(可选)
    根据实际需求,可以根据系统的运行情况调整PWM输出的周期和占空比。可以根据外部输入信号或系统状态来动态调整PWM输出。

三、寄存器介绍

1. PWMx控制寄存器PWMxCON

在这里插入图片描述
位功能说明:
在这里插入图片描述
下面示例:

PWM0CON = 0x81;
  • 允许 PWM0模块
  • PWM0占空比期间输出高电平,占空比溢出后输出低电平
  • PWM0使用系统时钟,不分频
  • 禁止PWM0周期中断
  • PWM0输出允许
PWM1CON=0xC1; //11000001
  • 允许PWM1模块
  • PWM1占空比期间输出低电平,占空比溢出后输出高电平
  • PWM1使用系统时钟
  • 禁止PWM1周期中断
  • PWM1输出允许

2. PWM0周期寄存器PWM0PH/L

在这里插入图片描述
输出周期为 [PWM0PH,PWM0PL] * PWM时钟周期 。
PWM0的计数器计数至PWM0PH/L值后归0,这时如果PWM0S=0,则PWM0输出低电平 ;如果PWM0S=1,则PWM0输出高电平。

示例:

	PWM0PL = 0xff;
	PWM0PH = 0x0f;

周期为 0xfff*系统时钟周期,假设系统时钟为12MHz,则PWM0周期为 0xfff/12MHz=0.34125ms

3. PWM1周期寄存器PWM1PH/L

在这里插入图片描述

4. PWM0占空比控制寄存器PWM0DH/L

在这里插入图片描述
位功能说明:
在这里插入图片描述

5. PWM1占空比控制寄存器 PWM1DH/L

在这里插入图片描述
位功能说明:
在这里插入图片描述
修改占空比要注意的是:

  • 修改寄存器 PWMxDH 将使得 PWMx 的输出在下一个周期生效。
  • 用户需先修改 PWMxDL ,再修改 PWMxDH 以修改 PWM占空比。
  • 无论 PWMxDH 是否被修改,都需要将 PWMxDH 再写一次。否则,低位的修改无效。

6. 占空比寄存器与周期关系

下图示例可以比较清楚看出PWMP和PWMD所指的时间:
在这里插入图片描述
即PWMP为PWM周期 ,
PWMD为PWM输出高/低电平时间,具体输出高还是低取决于PWMS的值。

四、代码实现示例

1. 基本功能

下面实例实现PWM输出的基本代码:

void init_pwm0()
{
	_push_(INSCON);
	Select_Bank0();
	PWM0PL = 0xff;
	PWM0PH = 0x0f;
	PWM0DL = 0xff;
	PWM0DH = 0x07;
	PWM0CON = 0x81;
	_pop_(INSCON);
}

void init_pwm1()
{
	_push_(INSCON);
	Select_Bank1();
	PWM1PL = 0xff;
	PWM1PH = 0x0f;
	PWM1DL = 0xff;
	PWM1DH = 0x07;
	PWM1CON = 0xc1;
	_pop_(INSCON);
}

代码选项设置,时钟使用128K:
在这里插入图片描述

2路PWM波形对比: (2路垂直偏移设置不同以方便观察)
在这里插入图片描述

2. 封装PWM函数

(1)pwm_utils.c

#include "pwm_utils.h"

/**
 * @param frequency 频率
 * @param duty 占空比,单位是百分比
 * @param polar 极性
 * @brief 初始化PWM0
 */
void Pwm0_Init(volatile U16 frequency, volatile U16 duty, volatile U16 polar) {
    // 周期,单位是ms
    volatile U16 period = 1000 / frequency;
    volatile U16 PWM0P = period * 128;
    volatile U16 PWM0D = (PWM0P / 100) * duty;
    _push_(INSCON);
    Select_Bank0();
    // 周期寄存器, 0x0fff=4095,周期=4095/128K=32ms
    // 通过周期计算PWM0Px的值,PWM0Px=period*128K/1000
    PWM0PL = PWM0P & 0xff;
    PWM0PH = PWM0P >> 8;
    // 占空比寄存器,0x07ff=2047
    // 计算占空比寄存器的值,PWM0Dx=周期寄存器值*duty/100
    PWM0DL = PWM0D & 0xff;
    PWM0DH = PWM0D >> 8;

    if (polar == 1) {
        PWM0CON |= 0x40;
    } else {
        PWM0CON &= 0xbf;
    }
    // PWM0控制寄存器 1000_0001, 使能、输出允许
    PWM0CON |= 0x81;
    _pop_(INSCON);
}

/**
 * @param frequency 频率
 * @param duty 占空比,单位是百分比
 * @param polar 极性
 * @brief 初始化PWM1
 */
void Pwm1_Init(volatile U16 frequency, volatile U16 duty, volatile U16 polar) {
    // 周期,单位是ms
    volatile U16 period = 1000 / frequency;
    volatile U16 PWM1P = period * 128;
    volatile U16 PWM1D = (PWM1P / 100) * duty;
    _push_(INSCON);
    Select_Bank1();
    // 周期寄存器
    PWM1PL = PWM1P & 0xff;
    PWM1PH = PWM1P >> 8;
    // 占空比寄存器
    PWM1DL = PWM1D & 0xff;
    PWM1DH = PWM1D >> 8;

    if (polar == 1) {
        PWM1CON |= 0x40;
    } else {
        PWM1CON &= 0xbf;
    }
    // PWM1控制寄存器 1100_0001,使能、占空比期间输出低电平、占空比溢出后输出高电平、输出允许
    PWM1CON |= 0x81;
    _pop_(INSCON);
}

(2)main.c

#include "SH79F9476.h"
#include "clk_utils.h"
#include "pwm_utils.h"


void main() {
	
    // 选择低速时钟
    lowFrequenceClk();

	Pwm0_Init(32, 50, 0);
    Pwm1_Init(32, 80, 1);

    while (1) {
    }
}

输出频率32Hz、占空比80、极性相反的波形运行示例:
在这里插入图片描述

本文参考资源来自中颖官网。
本文代码开源地址: https://gitee.com/xundh/learn-sinowealth-51

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

临床常用的8个护理评估量表分享,医护必备!

常笑医学整理了8个常用的护理评估量表,包括Morse跌倒量表、Braden压疮评分、格拉斯哥昏迷评分GCS、深静脉血栓评分DVT、Brathel日常生活活动能力量表等,这些量表在常笑医学网上均支持在线使用和下载,供医护人员学习与使用。 Morse跌倒危险因素…

【北京迅为】《iTOP龙芯2K1000开发指南》-第三部分 迅为龙芯开发板快速体验

龙芯2K1000处理器集成2个64位GS264处理器核,主频1GHz,以及各种系统IO接口,集高性能与高配置于一身。支持4G模块、GPS模块、千兆以太网、16GB固态硬盘、双路UART、四路USB、WIFI蓝牙二合一模块、MiniPCIE等接口、双路CAN总线、RS485总线&#…

webpack热更新原理详解

文章目录 前言基础配置创建项目HMR配置 HMR交互概览HMR流程概述HMR实现细节初始化注册监听编译完成事件启动服务监听文件代码变化服务端发送消息客户端收到消息热更新文件请求热更新代码替换 问题思考 前言 刷新分为两种:一种是页面刷新,不保留页面状态…

LANGUAGE-DRIVEN SEMANTIC SEGMENTATION

环境不易满足,不建议复现

CentOS7利用宝塔面板安装zabbix6.0.x详细安装教程(手把手图文详解版)

最近学习CentOS7安装zabbix6.0.x的版本,尝试了很多教程,很多都比较麻烦且容易出错,最后发现使用宝塔面板最为简单,将具体过程记录下来,一来分享给有需要的人,二来自己也当记录笔记,以免以后遗忘…

Hive中几个非常重要的问题

1、Hive 有哪些方式保存元数据,各有哪些优缺点 (1).DerBy数据库:默认自带 优点:使用简单,不需要额外的配置。 缺点:只有一个客户端,多个客户访问会报错。 (2).使用MySql数据库存储 优点:单独的…

OSPF的LSA详解

一、什么是LSA?LSA作用? 在OSPF协议中,LSA全称链路状态通告,主要由LSA头部信息(LSA摘要)和链路状态组成。部分LSA只有LSA头部信息,无链路状态信息。使用LSA来传递路由信息和拓扑信息&#xff0c…

linux系统安全

一、账号安全基本措施 1.1 系统账号清理 1.1.1 将用户设置为无法登录-- 改登录shell 登录shell是用户与计算机系统直接交互的接口,使用户能够通过命令行方式进行各种操作和管理。 所以让用户无法登录,其实就是将登录shell改为 /sbin/nologin,可以用us…

移动应用安全

移动应用安全 移动应用安全主要关注Android、iOS、Windows Phone等平台上移动应用软件安全状态。它涉及应用程序在其设计运行的平台上下文中的安全问题、它们使用的框架以及预期的用户集。所有主流的移动平台都提供大量可选的安全控制,旨在帮助软件开发人员构建安全…

面试官问如何实现二级缓存怎么进行回答以及延伸出更多知识点呢?

二级缓存的优势与缺点 优点: 1)二级缓存相比只调用一层 Redis 缓存,访问速度更快。对于一些不经常修改的数据而查询十分频繁的可以直接放在本地缓存(一级)里面。 作为面试者的扩展延伸:我在本地缓存的实…

【MySQL 数据宝典】【索引原理】- 002 示例+逐个字段学明白 Explain

一、Explain 概述 使用 EXPLAIN 关键字可以模拟优化器来执行SQL查询语句,从而知道MySQL是如何处理我们的SQL语句的。分析出查询语句或是表结构的性能瓶颈。 1.1 MySQL 查询过程 通过explain我们可以获得以下信息: 表的读取顺序数据读取操作的操作类型…

华为ensp中链路聚合两种(lacp-static)模式配置方法

作者主页:点击! ENSP专栏:点击! 创作时间:2024年4月26日11点54分 链路聚合(Link Aggregation),又称为端口聚合(Port Trunking),是一种将多条物理…

OU和域用户的创建

OU和域用户的创建 导航 文章目录 OU和域用户的创建导航一、创建ou二、创建用户三、验证 一、创建ou 在服务器管理器里面点击右上角的工具,选择Active Directory 用户和计算机右击我们的域,选择新建,选择组织单位,并填入我们的单位名字 二、创建用户 右击我们刚刚新建的组织…

prompt提示词:AI英语词典优化版Pro,让AI教你学英语,通过AI实现一个网易有道英语词典

目录 一、前言二、效果对比三、优化《AI英语词典》提示词四、其他获奖作品链接 一、前言 不可思议!我的AI有道英语字典助手竟然与百度千帆AI应用创意挑战赛K12教育主题赛榜首作品差之毫厘 ,真的是高手都是惺惺相惜的,哈哈,自恋一…

pytest参数化数据驱动(数据库/execl/yaml)

常见的数据驱动 数据结构: 列表、字典、json串 文件: txt、csv、excel 数据库: 数据库链接 数据库提取 参数化: pytest.mark.parametrize() pytest.fixture()…

Stable Diffusion WebUI 使用 VAE 增加滤镜效果

本文收录于《AI绘画从入门到精通》专栏,专栏总目录:点这里,订阅后可阅读专栏内所有文章。 大家好,我是水滴~~ 本文主要介绍 VAE 模型,主要内容有:VAE 模型的概念、如果下载 VAE 模型、如何安装 VAE 模型、如…

苍穹外卖学习

并不包含全部视频内容&#xff0c;大部分都按照操作文档来手搓代码&#xff0c;资料&#xff0c;代码都上传git。 〇、实际代码 0.1 Result封装 package com.sky.result;import lombok.Data;import java.io.Serializable;/*** 后端统一返回结果* param <T>*/ Data pub…

【EP2C35F672C8 EDA试验箱下载 38译码器实现】

文章目录 前言一、实验设备1.实验箱2.下载器&#xff1a; 二、编译工程1.编译工程2.添加tcl引脚配置文件2.1将tcl文件拷贝到工程目录下&#xff1a;2.2 在软件中添加tcl文件 3.tcl文件简答讲解 三、下载四、实验结果总结 前言 提示&#xff1a;这里可以添加本文要记录的大概内…

【LeetCode:2095. 删除链表的中间节点 + 链表】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

虚拟现实(VR)的应用场景

虚拟现实&#xff08;VR&#xff09;技术创建和体验三维虚拟世界的计算机仿真技术。用户通过佩戴VR头显等设备&#xff0c;可以完全沉浸在虚拟世界中&#xff0c;并与虚拟世界中的物体进行交互。VR技术具有广泛的应用前景&#xff0c;可以应用于各行各业。以下是一些VR的应用场…