历史上的今天

今天是:2024年10月15日(星期二)

正在发生

2021年10月15日 | STM8与汇编语言(16)--PWM

发布者:陈熙琼 来源: eefocus关键字:STM8  汇编语言  PWM 手机看文章 扫描二维码
随时随地手机看文章

在单片机应用系统中,也常常会用到PWM信号输出,例如电机转速的控制。现在很多高档的单片机也都集成了PWM功能模块,方便用户的应用。


对于PWM信号,主要涉及到两个概念,一个就是PWM信号的周期或频率,另一个就是PWM信号的占空比。例如一个频率为1KHZ,占空比为30%,有效信号为1的PWM信号,在用示波器测量时,就是高电平的时间为300uS,低电平的时间为700uS的周期波形。


在单片机中实现PWM信号的功能模块,实际上就是带比较器的计数器模块。首先该计数器循环计数,例如从0到N,那么这个N就决定了PWM的周期,PWM周期=(N+1)*计数器时钟的周期。在计数器模块中一定还有一个比较器,比较器有2个输入,一个就是计数器的当前值,另一个是可以设置的数,这个数来自一个比较寄存器。当计数器的值小于比较寄存器的值时,输出为1(可以设置为0),当计数器的值大于或等于比较寄存器的值时,输出为0(也可设置为1,与前面对应)。


了解了这个基本原理后,我们就可以使用STM8单片机中的PWM模块了。下面的实验程序首先将定时器2的通道2设置成PWM输出方式,然后通过设置自动装载寄存器TIM2_CCR2,决定PWM信号的周期。在程序的主循环中,循环修改占空比,先是从0逐渐递增到128,然后再从128递减到0。


当把下面的程序在ST的三合一板上运行时,可以看到发光二极管LD1逐渐变亮,然后又逐渐变暗,就这样循环往复。如果用示波器看,可以看到驱动LD1的信号波形的占空比从0变到50%,然后又从50%变到0。


同样还是利用ST的开发工具,生成一个汇编程序的框架,然后修改其中的main.asm,修改后的代码如下。


stm8/


      #include "mapping.inc"

      #include "STM8S207C_S.INC"


; 定义堆栈空间的起始位置和结束位置

stack_start.w  EQU   $stack_segment_start

stack_end.w   EQU    $stack_segment_end


             segment 'rom'           ; 下面开始定义一个段,该段位于ROM中

main.l                        ; 定义复位后的第一条指令的标号(即入口地址)

;

; 首先要初始化堆栈指针

       LDW    X,#stack_end        

       LDW    SP,X

;                                                            

       CALL   CLK_Init         ; 初始化时钟

       CALL   TIM_Init         ; 初始化定时器      

;

; 下面的循环将占空比逐渐从0递增到128

       LD     A,#$00

MAIN_LOOP.L                  

       PUSH   A               ; 保存当前占空比

       LD     A,#$00

       LD     TIM2_CCR2H,A

       POP    A

       LD     TIM2_CCR2L,A     ; 设置占空比

       PUSH   A               ; 保存当前占空比

       LD     A,#$5           

       CALL   DELAY_MS         ; 延时5MS

       POP    A              ; 恢复占空比

       INC    A              ; 当前占空比+1

       CP     A,#128           

       JRNE   MAIN_LOOP        ; 若不等于128,则循环

;

; 下面的循环将占空比逐渐128递减到0

MAIN_LOOP2.L                  

       PUSH   A               ; 保存当前占空比

       LD     A,#$00

       LD     TIM2_CCR2H,A

       POP    A

       LD     TIM2_CCR2L,A     ; 设置占空比

       PUSH   A               ; 保存当前占空比

       LD     A,#$5

       CALL   DELAY_MS         ; 延时5MS

       POP    A              ; 恢复占空比

       DEC    A              ; 当前占空比-1

       CP     A,#$00

       JRNE   MAIN_LOOP2       ; 若不等于0,则循环

      

       JRA    MAIN_LOOP        ; 重新开始大循环


; 函数功能:延时

; 输入参数:寄存器A -- 要延时的毫秒数,这里假设CPU的主频为2MHZ

; 输出参数:无

; 返 回 值:无

; 备    注:无

DELAY_MS.L

       PUSH   A               ; 将入口参数保存到堆栈中

       LD     A,#250          ; 寄存器A<-250,作为下面的循环数

DELAY_MS_1.L

       NOP                   ; 用空操作指令进行延时4T

       NOP

       NOP

       NOP

       NOP

       DEC    A              ; 寄存器A<-A-1,本条指令执行之间为1T

       JRNE   DELAY_MS_1       ; 若不等于0,则循环,

                                  ; 本条指令执行时间为2T(跳时)或1T(不跳时)

       POP    A              ; 从堆栈中恢复入口参数

       DEC    A              ; 将要延时的MS数-1

       JRNE   DELAY_MS         ; 若不等于0,则循环

       RET                   ; 函数返回



; 函数功能:初始化时钟

; 输入参数:无

; 输出参数:无

; 返 回 值:无

; 备    注:无

CLK_Init.L

       LD     A,#$E1

       LD     CLK_CMSR,A       ; HSI作为主时钟源

       LD     A,CLK_CKDIVR

       AND    A,#$E7

       OR     A,#$10

       LD     CLK_CKDIVR,A     ; 10: fHSI= fHSI RC output/ 4

                             ; fHSI = fHSI RC输出/4 = 4MHZ

                             ; 这个时钟也作为外设的时钟 

       OR     A,#$01

       LD     CLK_CKDIVR,A     ; 001: fCPU="fMASTER/2". = 2MHZ

       RET

;

; 函数功能:初始化定时器2的通道2,用于控制LED的亮度

; 输入参数:无

; 输出参数:无

; 返 回 值:无

; 备    注:无

TIM_Init.L

       LD     A,TIM2_CCMR2

       OR     A,#$70

       LD     TIM2_CCMR2,A ; Output mode PWM2.                   */

                         ; 通道2被设置成比较输出方式

                         ; OC2M = 111,为PWM模式2,

                         ; 向上计数时,若计数器小于比较值,为无效电平

[1] [2]
关键字:STM8  汇编语言  PWM 引用地址:STM8与汇编语言(16)--PWM

上一篇:STM8与汇编语言(15)--AD转换
下一篇:STM8与汇编语言(17)--蜂鸣器

推荐阅读

随着AI+医疗的进一步融合、深入,适用于细分医疗领域的AI辅助技术也在不断加强。服务机器人多个应用场景中,医疗必然是最重要之一。这不是简单的科技辅助,而是成为治疗环节的一部分,它们的角色开始转为“医组成员”,它们会测量患者的脉搏、扫描生命体征、阅读病例记录甚至进行手术。AI+医疗机器人的发展,意味着全世界的人将能得到更为普惠的医疗救助...
致力于亚太地区市场的领先半导体元器件分销商---大联大控股宣布,其旗下诠鼎推出基于高通(Qualcomm)QCC3024的耳机头盔一体化设解决方案。 随着生活节奏的加快,人们通过手机APP点餐越来越多,外卖配送员必须使用手机接单并和客户联系,才能将外卖快速准确的送达。由于送餐时间有限,配送员经常会在骑行中与客户电话确认,这是非常危险的。如果将耳机和头...
环境:主机:WIN8开发环境:MDK4.72ucgui版本:3.90mcu: stm32f103VE说明:本程序基于ucgui对话框机制设计了一个界面,并用6个实体按键对界面进行控制效果图:源码:gui_main.h/********************************************************************** 主界面模块头文件* (c)copyright 2014,jdh* All Right Reserved*新建时间:...
有经验的工程师都知道,如果我们要使用 数字示波器 来进行电源测量的话,就必须先测量MOSFET开关器件漏极、源极间的电压和电流,或IGBT集电极、发射极间的电压。但是如果我们需要完成这一测试测量任务,就必须要借助两种不同的 示波器探头来配合示波器一起完成测试测量任务。其中一支是高压差分探头,另外一支是电流探头。由于这两种探头是两种不同类型...

史海拾趣

问答坊 | AI 解惑

高薪诚聘数字类工程师

1、高级数字通信工程师 3名 通信、信号处理、电子工程或雷达相关专业毕业,本科以上学历,三年以上工作经验; 精通调制解调算法,有用Matlab或C进行算法模拟的相关工作经验; 精通FPGA、DSP应用设计,熟练运用VHDL或Veri ...…

查看全部问答∨

电子系统设计基本知识

本文有模拟电路、数字电路、单片机电路、ARM硬件、ARM编程等基础知识,里面还有电阻、电容、半导体二级管三极管等元器件的介绍,还有电源电路、电路设计、通信系统等。欢迎想学电子基础知识的人下载。…

查看全部问答∨

我的超声波带原理图与PCB

本帖最后由 paulhyde 于 2014-9-15 03:46 编辑 我的超声波带原理图与PCB  …

查看全部问答∨

大家A有整体方案了没有

本帖最后由 paulhyde 于 2014-9-15 09:04 编辑 大家A有整体方案了没有  …

查看全部问答∨

单片机C语言交流群

各位,本人创建了单片机C语言开发交流群,希望各位多多交流:69698592…

查看全部问答∨

三星S3C241O的中断问题

我最近在学华恒ARM9,用的是三星S3C2410当做到中断这个问题的时候,遇到了问题,还请各位大虾帮忙 问题如下: 1、不管我把中断置一还是置零都没看到区别,和芯片资料有出入,为什么会这样 2、我把中断待决寄存器和源待决寄存器的值读出来,发现 ...…

查看全部问答∨

请问哪里有无线协议的详细文档下载?

刚学GPRS开发,想找些无线通讯协议看看,google了一下,没找到,所以想请教一下,哪里有这一类的完整文档下载,谢谢!…

查看全部问答∨

MDK对于CORTEX3在C中插入汇编的问题?ADC?

MDK对于CORTEX3在C中插入汇编的问题?我使用ARM公司(keil)的MDK软件,CPU使用STM32F103,我想在C语言中插入汇编语言,按照MDK提供的帮助文件插入汇编的方法写如下语句:int qadd(int i, int j){     ...…

查看全部问答∨

超新手弱弱问题----关于定时器的问题

这几天在看书,发现里面说到定时器a和定时器b,我想问一下,定时器是不是属于单片机里面一个硬件呢?应该不是在msp430芯片里面的吧???…

查看全部问答∨

【MSP430共享】嵌入式超声波热量表系统的研制

分析和研究了时差法超声波热量表的测量原理, 设计了一种嵌入式超声波热量表系统。 以低功耗的嵌入式微处理器MS P 4 3 0 做为核心控制模块, 选用先进的时间数字转换芯片T DC . GP 2保证 了流量的测量精度, 将嵌入式操作系b ~ p C / OS 一 Ⅱ引 ...…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved