历史上的今天
返回首页

历史上的今天

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

正在发生

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

2021-10-15 来源:eefocus

在单片机应用系统中,也常常会用到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,

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

推荐阅读

史海拾趣

Antex公司的发展小趣事

随着业务的不断扩展,Antex在1980年决定将工厂从东京都大田区羽田迁至茨城县高萩市。这一搬迁不仅为公司提供了更广阔的发展空间,也标志着Antex开始向着全球化布局迈进。此后,公司积极寻求国际合作,与全球各地的供应商和客户建立了紧密的合作关系。

Agere System(LSI Logic)公司的发展小趣事

面对日新月异的电子行业发展趋势,Antex公司始终保持敏锐的市场洞察力和创新精神。公司积极推进技术开发、设备强化,不断探索新的生产技术和应用领域。同时,Antex还注重人才培养和团队建设,为公司的未来发展储备了丰富的人才资源。

这些故事只是Antex公司发展历程中的一部分,它们展示了公司在电子行业中的不断努力和追求卓越的精神。未来,随着技术的不断进步和市场的不断变化,Antex将继续保持创新和发展,为电子行业的繁荣做出更大的贡献。

请注意,以上内容仅为概述,并未详细展开每个故事的每一个细节。如果需要更具体、更详细的故事,建议查阅Antex公司的官方资料或相关新闻报道,以获取更准确、更全面的信息。

EMBEST公司的发展小趣事

随着公司业务的不断拓展和市场规模的逐步扩大,EMBEST在XXXX年成立了Timll和Giayee两个子公司。其中,Timll主要负责ARM工控业务,而Giayee则专门负责PDA/Smart Phone等业务。这两个子公司的成立不仅进一步拓展了EMBEST的业务领域,也为其未来的发展注入了新的活力。通过多元化的业务布局和精细化的管理,EMBEST在电子行业中的影响力日益增强。

Anixter Inc公司的发展小趣事

EMBEST公司成立于XXXX年,早期便专注于ARM嵌入式软件的开发。在XXXX年,EMBEST发布了国内首个具有自主知识产权的ARM嵌入式软件开发工具Embest IDE For ARM,这一里程碑式的产品不仅填补了国内市场的空白,也为EMBEST在嵌入式领域的地位奠定了基础。通过持续的创新和研发,EMBEST逐步建立了自己的技术壁垒,为公司的长远发展奠定了坚实基础。

Global Power Technology Co., Ltd公司的发展小趣事
首先拔掉电源插头,确保安全;然后取出冰箱内的食物和储物盒,用温水和中性洗涤剂清洗冰箱内部和外部;最后用干净的布擦干冰箱,确保没有残留水分。
EA Elektro-Automatik公司的发展小趣事

进入21世纪后,EA Elektro-Automatik加大了对研发的投入,致力于技术突破和产品创新。公司成功开发出一系列具有高精度、高可靠性和高性能的电力测试解决方案,如高速模拟稳压器、直流/交流源、并联操作设备等。这些产品不仅满足了市场对精密测试设备的需求,也进一步巩固了EA Elektro-Automatik在电子测量领域的领先地位。

问答坊 | AI 解惑

北京青云创新科技发展有限公司招聘高级研发工程师

大家好. 北京青云创新科技发展有限公司招聘高级研发工程师,希望符合条件的先生或女士积极投递简历. 岗位职责: 1、承担FPGA液晶驱动板及图形卡的设计及技术更改任务,负责所设计产品技术文件资料的整理归档工作; 2、负责对所设计产品的材料加工 ...…

查看全部问答>

嵌入式系统原理课件

第7章        定时部件 定时部件是嵌入式系统中常用的部件,其主要用作定时功能或计数功能。不同的定时部件在使用上有所差异,但它们的逻辑原理是相同的。本章具体以S3C2410芯片中的定时部件来介绍定时部件的工作原理、初始化 ...…

查看全部问答>

如何让客户主动找上门来

来源:金羊网 林景新让客户主动找上门来,这仅仅是成功营销的第一步。如何在客户上门之后,让客户信服企业产品能够真正为他们带来价值,这算是成功营销的第二步。而成功营销的第三步就是企业能够通过产品及服务,为客户创造“客户”或提升竞争力, ...…

查看全部问答>

程序在Windows CE运行变慢

有一个程序在window mobile上运行都正常,可是到window ce上运行就很慢,这是什么原因? 程序是用VC来开发的.…

查看全部问答>

Windows系统中的应用软件到底层硬件有几层结构

Windows系统中的应用软件到底层硬件有几层结构 每个方面的情况如何.…

查看全部问答>

请问高手149最多可以模拟多少个串口啊?

我现在知道用ta定时器可以模拟出三个串口,还有没有办法模拟更多?…

查看全部问答>

怎样胜任嵌入式系统工程师

1)掌握科学基础知识; 2)掌握嵌入式系统的硬件、软件知识; 3)掌握嵌入式系统分析的方法; 4)掌握嵌入式系统设计与开发的方法及步骤; 5)掌握嵌入式系统实施的方法 6)掌握嵌入式系统运行维护知识; 7)了解信息化基础知识、信息技术引用的基 ...…

查看全部问答>

寻求protues

哪位大侠能给小弟发个protues软件,最好带上教程 我以前学过,不过不是很精 我想好好的学一学 我的邮箱leran_wang@126.com 在这先谢啦…

查看全部问答>

PIC18单片机用C语言编程时如何调用硬件乘法器?

各位好,RT,看参考手册中有说明PIC18比PIC16系列多了一个硬件乘法器,当有C语言编程的时候怎样才可以使用到这个乘法器呢,我电脑里MPLAB C18和PICC 18都有安装,分别怎样使用?有没有前辈指导的,还请指点迷津,不胜感激!…

查看全部问答>