历史上的今天
今天是:2025年08月18日(星期一)
2021年08月18日 | 通过PWM做一个简单的呼吸灯
2021-08-18 来源:eefocus
PWM(脉冲宽度调制)是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在从测量、通信到功率控制与变换的许多领域中。
本例中我们通过MC9S12XS128微处理器来制作一个简单的呼吸灯,我们利用级联的PWM0和PWM1来做PWM的输出。
如下为本例中配置PWM所用到的寄存器简介:
PWMCTL寄存器

CON67=0时,6和7是独立的 8bit PWM通道
=1时,6和7级联为一个 16bit PWM通道
CON45=0时,4和5是独立的 8bit PWM通道
=1时,4和5级联为一个 16bit PWM通道
CON23=0时,2和3是独立的 8bit PWM通道
=1时,2和3级联为一个 16bit PWM通道
CON01=0时,0和1是独立的 8bit PWM通道
=1时,0和1级联为一个 16bit PWM通道
PSWAI =0时,在等待模式下允许时钟继续
=1时,在等待模式下禁止时钟输入
PFRZ=0时,在冻结模式下允许脉宽调制继续
=1时,在冻结模式下禁止时钟输入
(级联后由管脚号较大的决定电平极性,时钟信号源等等)
PWMPOL寄存器

PPOLn=0时,PWM在起始周期先为0再为1
=1时,PWM在起始周期先为1再为0
PWMPRCLK寄存器

PCKB[2:0]:时钟B的预分频位

PCKA[2:0]:时钟A的预分频位

PWMSCLA寄存器

Clock SA = Clock A / (2 * PWMSCLA)
PWMCLK寄存器

PCLK 7,6,3,2= 0时,Clock B作为PWM的时钟
=1时,Clock SB作为PWM的时钟
PCLK 5,4,1,0=0时,Clock A作为PWM的时钟
=1时,Clock SA作为PWM的时钟
PWMPERx寄存器

PWMx Period = Channel Clock Period x PWMPERx
PWMDTYx寄存器

PPOL x =0时,占空比 = [(PWMPERx-PWMDTYx)/PWMPERx] * 100%
PPOL x =1时,占空比 = [PWMDTYx / PWMPERx]*100%
PWME寄存器

PWMEx=0时,通道x禁止输出
PWMEx=1时,通道x允许输出
#include #include "derivative.h" #define LEDCPU PORTB_PB1 //定义连接发光二级管的PORTB_PB1口数据寄存 //为LED,写'0'亮,写'1' 灭 #define LEDCPU_dir DDRB_DDRB1 //定义连接发光二级管的PORTB_PB1口方向寄存器 //为LEDCPU_dir,写'0'做输入口,写'1'做输出口 void INIT_PLL(void) //busclock 32M { CLKSEL_PLLSEL=0; //总线时钟来源于晶振 PLLCTL_PLLON=0; //先关闭PLL SYNR=0x40 | 0x03; REFDV=0x80 | 0x01; POSTDIV=0x00; //PLL配置为64MHz PLLCTL_PLLON=1; //打开PLL _asm(nop); _asm(nop); while(!(CRGFLG_LOCK==1)); //确定PLL是否稳定LOCK=1 稳定,=0 不稳定 CLKSEL_PLLSEL =1; //总线时钟来源于PLL } void init_pwm(void) { PWMCTL_CON01= 1; //级联0号和1号通道形成16位PWM通道号,由PWM1输出 PWMPOL_PPOL1= 1; //通道01的极性为高电平有效 PWMPRCLK = 0x55; //A时钟和B时钟的分频系数为32,频率为1MHz PWMSCLA = 25; //SA时钟设置寄存器 //CLOCK SA=CLOCK A/(2*PWMSCLA) //CLOCK SA=1M/2*25=20KHz PWMCLK =0x02; //通道01用SA时钟作为时钟源 PWMPER01 = 200; //通道01的周期为100Hz PWMDTY01 = 0; //通道01的占空比为0% PWME_PWME1 = 1; //使能通道01 } void delay(void) { unsigned int i,j; for(i=0;i<20;i++) for(j=0;j<50000;j++); } void main(void) { DisableInterrupts; //禁止所有中断打开 INIT_PLL(); //初始化PLL模块 init_pwm(); //初始化pwm模块 LEDCPU_dir=1; //设置连接发光二级管的PORTB_PB0口为输出口 LEDCPU=1; //初始化发光二极管为亮 EnableInterrupts; //允许所有中断打开 for(;;) { delay(); PWMDTY01=20; //占空比为10% delay(); PWMDTY01=40; //占空比为20% delay(); PWMDTY01=60; //占空比为30% delay(); PWMDTY01=80; //占空比为40% delay(); PWMDTY01=100; //占空比为50% delay(); PWMDTY01=120; //占空比为60% delay(); PWMDTY01=140; //占空比为70% delay(); PWMDTY01=160; //占空比为80% delay(); PWMDTY01=180; //占空比为90% delay(); PWMDTY01=200; //占空比为100% delay(); PWMDTY01=180; //占空比为90% delay(); PWMDTY01=160; //占空比为80% delay(); PWMDTY01=140; //占空比为70% delay(); PWMDTY01=120; //占空比为60% delay(); PWMDTY01=100; //占空比为50% delay(); PWMDTY01=80; //占空比为40% delay(); PWMDTY01=60; //占空比为30% delay(); PWMDTY01=40; //占空比为20% } } 将P1脚接到B口的任意一个管脚就可以看到所对应的LED做出呼吸灯一样的状态了
史海拾趣
|
这是main.c,整个工程就是这一个源文件,在IAR下,怎么就是进不了FIQ中断,大侠帮我看一下,谢谢,搞了好几天了 目的是将P0.16设置为EINT0,然后EINT0设置为FIQ中断,由于只有一个FIQ,所以FIQ服务程序就随便写了几句 ...… 查看全部问答> |
|
目录: 第一篇 有限差分法 第一章 有限差分法 第二篇 有限元法 第二章 有限元法的基本原理和实施 第三章 二维等参元有限元法 第四章 三维场中的有限元法 第五章 非线性场中的有限元法 第六章 时变场中的有限元法 第三篇 矩量法、模拟电 ...… 查看全部问答> |
|
开发板:ZLG出品的EasyArm1138开发板(以前以100RMB购进的,现在有时间了,来学习下ARM) 开发软件:IAR Embedded Workbench 5.0 Kickstart 学习目标:主要是为了熟悉ARM的体系结构,不对外设做过多的涉足,所以基本的目标如下。 Ø&n ...… 查看全部问答> |
|
STM32F103USB实现双接口(Keypad+Mouse)的问题!! 利用STM USB固件库 单独实现多端点HID传输、Mouse 或Keypad均没有任何问题! 在实现双接口设备时总线挂起!!!!! /* USB Configuration Descriptor */如下 /* All Descriptors (Configuration, Interface, Endpoint, Class, Vendo ...… 查看全部问答> |
|
220V交流输入24V4A输出的开关电源,空载和轻载时输出电压约为42V,电源本身发热厉害。电源为单端反击式,使用UC3844驱动,想改成轻载输出时也比较稳定的电源,输出功率有所下降也可以接受,输出滤波电容是35V的。 目前想减小UC3844震荡的 ...… 查看全部问答> |
|
近日再用DS12887制作辉光管电子钟(52+12887+74HC595),在用protues做仿真。现在写数据是可以了,旁边的12887小框能读到写的数据。LED显示数据是通过数组来读取的,显示程序没有错,调节时间时能正确显示,但是到运行时显示却是6位都显示8,且一直 ...… 查看全部问答> |
|
本帖最后由 dontium 于 2015-1-23 11:39 编辑 哪位大神给传个WEBENCH? Designer的使用教程啥的啊,本人想设计 一个电源,就是不会用啊,希望大神不吝赐教啊 … 查看全部问答> |
|
如上图,在VLED和GND之间接上蜂鸣器,现在遇到自认为难以解释的现象,还请高人释惑!现象描述如下: 1、如果先将蜂鸣器接到电路板上的VLED和GND之间,然后24V开关电源上电,给电路板供电,则蜂鸣器正常鸣叫,且整个电路板正常工作; 2、如果24V ...… 查看全部问答> |




