产生频率或者占空比可调的PWM波【汇编语言】

4 篇文章 0 订阅
1 篇文章 0 订阅

PWM在各个编程中都非常的重要,在学习32单片机,FPGA等中都有学习到,本次文章为介绍汇编语言编写频率或占空比可调的PWM波,从更加底层的方面介绍和去了解pwm波生成的过程,基于S3C2410X/S3C2440X。

 

目录

一、PWM定时器整体

    1.1 定时器整体分析

    1.2定时器寄存器配置输出

二、寄存器详解

    2.1定时器配置寄存器0

 2.2 定时器配置寄存器1

​编辑 2.3 定时器控制寄存器

2.4 定时器计数缓冲寄存器与比较寄存器

 三、程序编程

3.1 通过PWM组件定时器2控制PWM输出频率100KHZ、占空比位10/100 – 90/100波形

 3.2  PWM组件的定时器2控制PWM输出频率为3000-15000HZ、占空比位4/5的波形。


一、PWM定时器整体

    1.1 定时器整体分析

        这里可以看到系统所拥有的定时器资源,拥有俩个带死区的pwm,俩个不带死区的pwm和一个内部使用,没有输出的定时,其中主要是依靠其系统时钟PCLK进行多次分频后通过比较输出pwm,pwm输出网上有很多基础知识可以去查看,在汇编中需要我们配置相关的寄存器从而控制其分频系数大小、是否使能、是否输出、是否复位等一系列操作,相关寄存器配置完全后才能正常输出pwm具体整体图见图1.1所示;(把图仔细理解来便可以进行下一步了

图1.1  PWM定时器控制器组件

    1.2定时器寄存器配置输出

             我们要配置PWM输出我们主要配置定时器配置寄存器(TCFG)、定时器控制寄存器(TCON)定时器缓冲寄存器(TCNTB)、定时器比较寄存器(TCMPB)、定时器观察寄存器(TCNTO)等以控制和查看PWM定时器的工作,其过程见图1.2所示;

 图1.2  PWM配置输出过程

二、寄存器详解

    2.1定时器配置寄存器0

   定时器配置寄存器0(TCFG0)配置定时器0-4的预分频系数并决定死区长度,可读/写 

我们看定时器结构可以知道: 输入频率= PCLK / (预分频值+1)/分频数

        定时器配置寄存器TCFG0各位含义 ,可以看到T1和T0是有8位一起决定的,而T2、T3、T4由另外8为决定的,2^8=256,所以分频可以为(0-255)+1分频;需要输出PWM波这个预分频需要考虑好所使用的定时器后如何配置其分频系数。

31-24

23-16

15-8

7-0

TCFG0

保留

DZL死区长度

PRC1预分频系数1

PRC0预分频系数0

含义

保留

8位确定死区长度

8位决定T4、T3、

T2预分频器值

8位决定T1、T0

的预分频器值

 2.2 定时器配置寄存器1

      在查看PWM输出的整体结构图后第一步是配置好预分频数后接下来便是配置分频器系数了,这里不像TCFG0,多个定时器“绑一起”,这里各个定时器是独立的

            大家可以看到寄存器的是用四位来配置选择1/2,1/4,1/8,1/16,有些人便会疑惑:“我用俩位就可以决定的为什么要用四位来决定呢”  ,其实这是因为4位计算机是最好处理的,所以用的是四位而不是俩位,这里要注意到定时器分频都是独立配置的。

 2.3 定时器控制寄存器

        配置好了预分频系数和分频器数那么输入f就确定了,接下来便是配置定时器的其他工作了,TCON主要控制定时器T0-T4的工作,可读/写。

        当你选择好哪个定时器输出PWM波,那需要在所对应的位上配置好,主要有定时器的启动/停止,确定是否手动更新,是否输出反转,是否自动重装等 操作。

2.4 定时器计数缓冲寄存器与比较寄存器

     在前面我们配置好了输入频率f ,了解了定时器的工作寄存器的配置,接下来便是要输出一定占空比的PWM波,也称为脉冲宽度调制,主要的俩个为一个周期的大小和高电平的大小,那么这俩个就由TCNTBn和TCMPBn决定;  PWM输出占空比= TCMPBn / TCNTBn 

 

 三、程序编程

3.1 通过PWM组件定时器2控制PWM输出频率100KHZ、占空比位10/100 – 90/100波形

 这里我都给了注释: 唯一一点是关闭定时器,书上是rTCON=0x0我认为这样并不能关闭定时器2而是关闭定时器0,所以我这里写的是rTCON=0x000;其div便是一个pwm的周期也就是TCNTBn的大小。

 3.2  PWM组件的定时器2控制PWM输出频率为3000-15000HZ、占空比位4/5的波形。

       这里和上面是类似的,PWM输出有俩大重要参数,一个是频率,一个是占空比,把握好这俩个你才能更好的输出你想要的PWM波,前面和后面的配置是类似的,只是工作的部分代码不同,大家可以好好对比对比便能发现了。

 该为学习嵌入式汇编语言的学习,对于了解更加底层的寄存器编写程序能够让我们更加了解整个系统的工作机理从而更好的编写程序,也为之后其他学习打好基础。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,我可以为您提供一份汇编代码示例,但需要先了解一些基础知识。 首先,PWM(脉冲宽度调制)是一种周期性的数字信号,在单片机中可以使用定时器/计数器来产生占空比是高电平与周期之比,可以通过设置定时器计数值和比较值来控制。 在51单片机中,有两个定时器/计数器,分别为Timer0和Timer1。以下是一个使用Timer0产生可调占空比PWM的汇编代码示例: ``` ; 定义端口和常量 PWM_PORT equ P1 ; PWM输出端口 PWM_FREQ equ 100 ; PWM频率为100Hz PWM_DUTY equ 50 ; PWM占空比为50% ; 初始化Timer0 MOV TMOD, #0 ; 定时器模式,使用模式1 MOV TH0, #0 ; 定时器初值为0 MOV TL0, #0 ; 定时器初值为0 ; 计算定时器计数值和比较值 MOV A, #256 ; Timer0为8位计数器,最大计数值为256 MOV B, #((10000/PWM_FREQ)/256) ; 计算定时器计数值 MOV R1, #((PWM_DUTY*256)/100) ; 计算占空比对应的比较值 ; 开始产生PWM PWM_LOOP: SETB PWM_PORT ; 设置PWM输出端口为高电平 MOV TH0, B ; 设置定时器计数值 MOV TL0, #0 ; 定时器初值为0 SETB TR0 ; 启动Timer0 DJNZ R1, $ ; 比较值不为0时继续输出高电平 CLR TR0 ; 停止Timer0 CLR PWM_PORT ; 设置PWM输出端口为低电平 MOV TH0, A ; 设置定时器计数值 MOV TL0, #0 ; 定时器初值为0 SETB TR0 ; 启动Timer0 DJNZ R1, PWM_LOOP ; 比较值不为0时继续输出低电平 CLR TR0 ; 停止Timer0 SJMP PWM_LOOP ; 循环输出PWM ``` 在上述代码中,通过设置Timer0的计数值和比较值,实现了产生可调占空比PWM。其中,变量B表示定时器计数值,变量R1表示占空比对应的比较值,通过循环输出高电平和低电平来实现PWM产生。 需要注意的是,上述代码中的PWM输出端口为P1口,您需要根据实际硬件连接情况进行修改。另外,由于Timer0的计数值和比较值的设置与PWM频率占空比有关,需要根据实际要求进行计算和调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Esaki diode

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值