STM8与汇编语言(16)--PWM

发布者:陈熙琼最新更新时间:2021-10-15 来源: 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)--蜂鸣器

推荐阅读最新更新时间:2024-11-11 11:34

基于PWM模块和CWG模块的直流电机伺服系统设计
  直流电动机结构简单,工作稳定可靠,较易实现伺服控制。本文以 PIC16F1508 单片机 为控制器,运用其PWM模块和CWG模块产生带死区的互补PWM波形,输入给H桥驱动的上下桥臂,有效解决了直流电动机H桥驱动上下桥臂的直通问题。   引言   直流电动机是最早发明的电动机,也是最早实现调速的电动机。在大多数调速场合,优先选择的还是直流电动机,因为其价格便宜、调速较易实现,且调速效果相对平稳。目前,直流电动机仍被广泛应用于智能玩具与按钮调节式汽车座椅中。   1 直流电动机伺服系统组成   直流电动机伺服系统主要包括控制器PIC16F1508、光电隔离电路、驱动电路、速度检测与电平转换电路,如图1所示。   图
[单片机]
基于<font color='red'>PWM</font>模块和CWG模块的直流电机伺服系统设计
MCS-51单片机汇编语言:数据传送指令有哪些
数据传送指令是MCS-51单片机汇编语言程序设计中使用最频繁的指令,包括内部 RAM、寄存器、外部RAM以及程序存储器之间的数据传送。 数据传送操作是指把数据从源地址传送到目的地址,源地址内容不变。 1. 以累加器A为目的操作数的指令 MOV A, #data ; A← #data MOV A, Rn ; n=0~7, A← (Rn) MOV A, @Ri ; i=0,1 , A← ((Ri)) MOV A, direct ; A← (Rn) direct为内部RAM或SFR地址 2. 以Rn为目的操作数的指令 MOV Rn, A ;Rn ← (A) , n=0~7
[单片机]
msp430F149调PWM
还说好好安下心调我的PID 结果又被某人喊调一个占空比为10%的PWM波 这不,直接上代码吧: But first,还是要先解释一下端口:按键改变PWM的占空比 按键IO口如下: 然后就是用P2.3和P2,4口输出两路PWM信号 #include msp430x14x.h #define uchar unsigned char #define uint unsigned int #define keyin (P1IN & 0x0f) uchar T ={10,20,40,100,150,200}; //高电平持续 void delay(void) { uint tmp; for(tmp =
[单片机]
msp430F149调<font color='red'>PWM</font>
德州仪器推出业界首款具有双通道异步取样率转换器的 8 通道PWM 音频处理器
日前,德州仪器 (TI) 宣布推出业界首款在单芯片上集成双通道异步取样率转换器 (ASRC) 的 8 通道脉宽调制器 (PWM) 音频处理器。符合 HD 标准的 TAS5548 有助于家庭及专业音频设计人员无缝整合两个音频源,相比需要两个芯片的同类竞争解决方案,该方案可提高设计灵活性并降低成本。该器件不但 支持8 至 192 kHz 的取样速率,同时还可将其转换为 96 kHz 或 192 kHz 固定速率,无需创建、存储和修改系数。这可简化一体化蓝光家庭影院 (HTiB)、音视频接收器、迷你/微型组合设备以及条形音箱等数字多通道产品的设计。如欲了解更多详情或订购样片,敬请访问: www.ti.com.cn/tas5548-pr-
[嵌入式]
基于51单片机的PWM+L293d控制直流电机程序
左侧开关减速,右侧加速。l293d芯片驱动直流电机 单片机源代码: #include reg51.h #define Tpwm 0xfc18//PWM周期对应的计数值1ms,基于12MHz晶振 unsigned int duty ={0,/*0*/ 0xff9c/*100us*/,0xff38/*200us*/,0xfed4/*300us*/, 0xfe70/*400us*/,0xfe0c/*500us*/,0xfda8/*600us*/, 0xfd44/*700us*/,0xfce0/*800us*/,0xfc7c/*900us*/, 0xfc18/*1000us*/};//PWM高电平时间 unsigned cha
[单片机]
基于51单片机的<font color='red'>PWM</font>+L293d控制直流电机程序
STM32F103 实验 PWM输出
正文 实验目的 使用TIM3的通道2,把通道2重映射到PB5,产生PWM来控制DS0的亮度 实验内容 脉冲宽度调制(PWM),是英文“Pulse Width Modulation”的缩写,简称脉宽调制,是利用 微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。简单一点,就是对脉冲宽 度的控制。 STM32 的定时器除了 TIM6 和 7。其他的定时器都可以用来产生 PWM 输出。其中高级定 时器 TIM1 和 TIM8 可以同时产生多达 7 路的 PWM 输出。而通用定时器也能同时产生多达 4 路的 PWM 输出,这样,STM32 最多可以同时产生 30 路 PWM 输出! 要使 STM32 的通用定时器
[单片机]
STM32F103 实验 <font color='red'>PWM</font>输出
利用PWM生成正弦波程序
/******************************************************************* 实验名称:产生正弦波演示实验 器件:ATmega16L 晶振:外部 12M 接线方法: 1.PD5接低通滤波输入 2.用示波器测其输出波形 *******************************************************************/ #include iom16v.h #include macros.h #include signal.h #pragma interrupt_handler timer1:9 char auc
[单片机]
51单片机PWM控制LED亮灭
设计思路:用定时器中断产生最小时间单位T0,每m个T0组成一个子 周期 T10,其中前n个T0为LED导通时间,即Ton=n*T0,则Toff=(m-n)*T0 ;每X个T10组成一个母周期T20,其中前y个T10为有效控制时间,后续的(x-y)个T10令LED熄灭或者子周期占空比调至最小。 ;适当调节n/m和x/y的比例使显示效果达到最佳。 ;以下是刚刚调试通过的小段程序,显示效果良好。 ;实验过程本人有一种推测,不知是否成立: ;子周期的最小占空比的宽度应大于LED的点亮时间,即点亮LED的时间宽度n/m*T0应足够产生余辉。类似于动态数码管对点亮时间的要求。 ;母周期的宽度应小于1/50s,提高刷新频率以令肉眼察觉不出闪烁。
[单片机]
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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