用STC单片机的PCA功能产生PWM_脉冲

用STC单片机的PCA功能产生PWM_脉冲
用STC单片机的PCA功能产生PWM_脉冲

用SST 单片机的PCA功能产生PWM 脉冲

一、程序说明:

SST单片机带有5路PCA模块,PCA功能比普通的单片机相比提供更强的计时性,同时更少CPU的干预,用它可以减少软件的开销和改进精度。利用PCA的脉冲宽度调制(PWM)模式可以产生一个8位PWM,它通过比PCA定时器的低位(CL)和比较寄存器的低位(CCAPnL)产生。当CL=CCAPnL是输出为高。要进入这个模式,可以对CC APMn的PWM和ECOM位置位。

在PWM 模式,输出的频率决定于PCA定时器的源。由于只有一对CH 和CL寄存器,所有模块共享PCA定时器和频率。输出的占空比由装在高位CCAPnH的值控制。由于写入CCAPnH 寄存器不是同步的,写入高位的值不会马上装入CCAPnL做比较,直到输出的另一个周期(当CL从255到0翻转)。用下面的公式计算任何占空比CCAPnH 值:

CCAPnH=256(1-占空比)

CCAPnH 是8 位整数,占空比是分数。

脉冲宽度调制频率

PCA定时器模式PWM 频率

12MHz16MHz

1/12振荡频率 3.9KHz 5.2KHz

1/4振荡频率11.8KHz 15.6KHz

定时器0溢出:8位

16位

8位自动重装15.5Hz

0.06Hz

3.9KHz 到15.3KHz

20.3Hz

0.08Hz

5.2KHz 到20.3KHz

外部输入(最大) 5.9KHz 7.8KHz

二、相关寄存器介绍:

PCA定时器/计数器模式寄存器(CMOD)

位置76543210

D9H CIDL WDTE - - - CPS1 CPS0 ECF

标志功能

CIDL 计数器空闲控制,CIDL=0时,PCA在空闲模式下继续工作。CIDL=1时,PCA在空闲模式下关闭。

WDTE 看门狗定时器使能:WDTE=0时,禁止PCA模块4的看门狗功能。WDTE=1时,使能。CPS1 PCA计数脉宽选择位1

CPS0 PCA计数脉宽选择位0

CPS1 CPS0 选择PCA输入*

0 0 0 内部时钟6时钟模式下为fosc/6(12时钟模式下为fosc/12)

0 1 1 内部时钟6时钟模式下为fosc/2(12时钟模式下为fosc/4)

1 0

2 定时器0溢出

1 1 3 ECI/P1.2脚输入的外部时钟(6时钟模式最大为osc/4,12

时钟模式下为fosc/8)

fosc=振荡器频率

ECF PCA使能计数器溢出中断:ECF=1,使能CCON 中的CF位,产生中断。

ECF=0时禁止CF的功能。

PCA定时器/计数器控制寄存器(CCON)

位置76543210

D8H CF CR - CCF4 CCF3 CCF2 CCF1 CCF0

标志功能

CR PCA计数器运行控制位,由软件置位将PCA计数器打开,要关闭PCA计数器必须由软件清零。

CL PCA计数器

低字节

E9H

CH PCA计数器

高字节

F9H

CCAP M0 模块0模式寄

存器

DAH - ECOM0 CAPP0 CAPN0 MAT0 TOG0 PWM0 ECCF0

CCAP0 H 模块0捕获高

字节

FAH CCAP0H[7:0]

CCAP0 L 模块0捕获低

字节

EAH CCAP0L[7:0]

三、PWM示例程序代码:

#include

#include “SST89x5x4Rx.h”

// 程序通过比较CL寄存器和CCPA0L的值产生脉冲。

// 如果CL >= CCAP0L输出为高,如果CL < CCAP0L输出为低。

// 占空比由CCAP0H的值决定.

void main()

{ CMOD = 0x02; // Setup PCA timer

CL = 0x00;

CH = 0x00;

CCAP0L = 0x40; // Set the initial value same as CCAP0H CCAP0H = 0x40; // 75% Duty Cycle

CCAPM0 = 0x42; // Setup PCA module 0 in PWM mode.

CR = 1; // Start PCA Timer.

while (1){}

}

单片机如何产生PWM

单片机产生PWM 1.PWM定义 脉冲宽度调制(PWM)是英文“Pulse Width Modulation”的缩写,简称脉宽调制。它是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用于测量,通信,功率控制与变换等许多领域。 脉冲宽度调制(PWM)是一种对模拟信号电平进行数字编码的方法。通过高分辨率计数器的使用,方波的占空比被调制用来对一个具体模拟信号的电平进行编码。PWM信号仍然是数字的,因为在给定的任何时刻,满幅值的直流供电要么完全有(ON),要么完全无(OFF)。电压或电流源是以一种通(ON)或断(OFF)的重复脉冲序列被加到模拟负载上去的。通的时候即是直流供电被加到负载上的时候,断的时候即是供电被断开的时候。只要带宽足够,任何模拟值都可以使用PWM进行编码。 2.PWM控制的基本原理 理论基础:冲量相等而形状不同的窄脉冲加在具有惯性的环节上时,其效果基本相同。冲量指窄脉冲的面积。效果基本相同,是指环节的输出响应波形基本相同。低频段非常接近,仅在高频段略有差异。 图1 形状不同而冲量相同的各种窄脉冲 面积等效原理: 分别将如图1所示的电压窄脉冲加在一阶惯性环节(R-L电路)上,如图2a所示。其输出电流i(t)对不同窄脉冲时的响应波形如图2b所示。从波形可以看出,在i(t)的上升段,i(t)的形状也略有不同,但其下降段则几乎完全相同。脉冲越窄,各i(t)响应波形的差异也越小。如果周期性地施加上述

脉冲,则响应i(t)也是周期性的。用傅里叶级数分解后将可看出,各i(t)在低频段的特性将非常接近,仅在高频段有所不同。 图2冲量相同的各种窄脉冲的响应波形 3. PWM相关概念 占空比:就是输出的PWM中,高电平保持的时间与该PWM的时钟周期的时间之比 如,一PWM的频率是1000Hz,那么它的时钟周期就是1ms,如果高电平出现的时间是200us,那么低电平的时间肯定是800us,那么占空比就是200:1000,也就是说PWM的占空比就是1:5。 分辨率:占空比最小能达到的值,如8位的PWM,理论的分辨率就是1:255(单斜率), 16位的的PWM理论就是1:65535(单斜率)。 频率:如16位的PWM,它的分辨率达到了1:65535,要达到这个分辨率,T/C就必须从0计数到65535才能达到。相对于周期就是65535*计数脉冲时间。 双斜率 / 单斜率: 假设一个PWM从0计数到80,之后又从0计数到80.......这个就是单斜率。 假设一个PWM从0计数到80,之后是从80计数到0.......这个就是双斜率。

合泰单片机生成pwm

#include "HT66FU70A.h" #define RS _pc0 #define RW _pc1 #define E _pd6 float ad_shidu; //湿度变量 float ad_wendu; //温度变量 char Sunshine; //光照变量 char timer0_cnt; long int m; unsigned int temp=0; void ad_init(void) //A/D转换初始化 { //8分频;内部1.25V电压除能;内部参考电源电压来源于VDD _adcr1 = 0x03; //启动A/D转换模块(ADCR0寄存器第5位) _adoff = 0; } void ad_pa1(void) //pa1端口ad配置 { //定义PA1为A/D输入,即AN1 _pas0 = 0x30; //选择模拟通道AN1;ADC数据高字节是ADRH的第7位,低字节是ADRL的第4位_adcr0 = 0x01; } void ad_pa3(void) //pa3端口ad配置 { //定义PA1为A/D输入,即AN1 _pas1 = 0x30; //选择模拟通道AN1;ADC数据高字节是ADRH的第7位,低字节是ADRL的第4位_adcr0 = 0x03; } //开始进行ad转换 void ad_switch(void)

{ //ADCR0寄存器第七位 _start=1; //start位0->1->0,表示启动A/D转换 _start=0; } void pwn_1(void) { _pcc5=0; //输出 _pcpu5=1; //上拉 // _pc5 = 1; _pcs2 |= (2 << 4); //PC5 功能选择为TM1输出 // _tm1c1=0b10101000; // _tm1c0=0b00001111; _tm0c0 |= (0 << 4); //fsys/4 _tm0c0 |= (1 << 0); //CCRP:001b _tm0al = 0x3f; _tm0ah = 0x00; _tm0c1 |= (2 << 6); //PWM模式 _tm0c1 |= (2 << 4); //PWM 输出 _tm0c1 |= (1 << 3); //高有效 _tm0c1 &=~(1 << 1); //CCRP-周期CCRA-占空比_tm0c0 &=~(1 << 7); //运行定时器 _tm0c0 |= (1 << 3); //计数器On /*_tm0c0 |= (1 << 3); //计数器On*/ } void pwn_2(void) { _pcc6=0; //输出 _pcpu6=1; //上拉 // _pc5 = 1; _pcs3 |= (1 << 0); //PC5 功能选择为TM1输出 // _tm1c1=0b10101000; // _tm1c0=0b00001111; _tm0c0 |= (0 << 4); //fsys/4 _tm0c0 |= (1 << 0); //CCRP:001b _tm0al = 0x3f; _tm0ah = 0x00; _tm0c1 |= (2 << 6); //PWM模式 _tm0c1 |= (2 << 4); //PWM 输出 _tm0c1 |= (1 << 3); //高有效

51单片机产生PWM的程序

51单片机产生PWM的程序 其中P1.3 P1.4是两个输出/**************************************************************** *程序思路说明: * * *关于频率和占空比的确定,对于12M晶振,假定PWM输出频率为1KHZ,这样定时中断次数 * *设定为C=10,即0.01MS中断一次,则TH0=FF,TL0=F6;由于设定中断时间为0.01ms,这样可以设定占空比可从1-100变化。即0.01ms*100=1ms * ***************************************************************** *************/ #include #define uchar unsigned char /**************************************************************** ************* * TH0和TL0是计数器0的高8位和低8位计数器,计算办法:TL0=(65536-C)%256; * * TH0=(65536-C)/256,其中C为所要计数的次数即多长时间产生一次中断;TMOD是计数器*

* 工作模式选择,0X01表示选用模式1,它有16位计数器,最大计数脉冲为65536,最长时 * * 间为1ms*65536=65.536ms * ***************************************************************** *************/ #define V_TH0 0XFF #define V_TL0 0XF6 #define V_TMOD 0X01 void init_sys(void); /*系统初始化函数*/ void Delay5Ms(void); unsigned char ZKB1,ZKB2; void main (void) { init_sys(); ZKB1=40; /*占空比初始值设定*/ ZKB2=70; /*占空比初始值设定*/ while(1) {

单片机PWM(脉冲宽度调制)原理与实现

、PWM原理 2、调制器设计思想 3、具体实现设计 一、PWM(脉冲宽度调制Pulse Width Modulation)原理: 脉冲宽度调制波通常由一列占空比不同的矩形脉冲构成,其占空比与信号的瞬时采样值成比例。图1所示为脉冲宽度调制系统的原理框图和波形图。该系统有一个比较器和一个周期为Ts的锯齿波发生器组成。语音信号如果大于锯齿波信号,比较器输出正常数A,否则输出0。因此,从图1中可以看出,比较器输出一列下降沿调制的脉冲宽度调制波。 通过图1b的分析可以看出,生成的矩形脉冲的宽度取决于脉冲下降沿时刻t k时的语音信号幅度值。因而,采样值之间的时间间隔是非均匀的。在系统的输入端插入一个采样保持电路可以得到均匀的采样信号,但是对于实际中tk-kTs< (1) 其中,x{t}是离散化的语音信号;Ts是采样周期;是未调制宽度;m是调制指数。 然而,如果对矩形脉冲作如下近似:脉冲幅度为A,中心在t = k Ts处,在相邻脉冲间变化缓慢,则脉冲宽度调制波xp(t)可以表示为: (2) 其中,。无需作频谱分析,由式(2)可以看出脉冲宽度信号由语音信号x(t)加上一个直流成分以及相位调制波构成。当时,相位调制部分引起的信号交迭可以忽略,因此,脉冲宽度调制波可以直接通过低通滤波器进行解调。 二、数字脉冲宽度调制器的实现: 实现数字脉冲宽度调制器的基本思想参看图2。 图中,在时钟脉冲的作用下,循环计数器的5位输出逐次增大。5位数字调制信号用一个寄存器来控制,不断于循环计数器的输出进行比较,当调制信号大于循环计数器的输出时,比较器输出高电平,否则输出低电平。循环计数器循环一个周期后,向寄存器发出一个使能信号EN,寄存器送入下一组数据。在每一个计数器计数周期,由于输入的调制信号的大小不同,比较器输出端输出的高电平个数不一样,因而产生出占空比不同的脉冲宽度调制波。 图3 为了使矩形脉冲的中心近似在t=kTs处,计数器所产生的数字码不是由小到大或由大到小顺序变化,而是将数据分成偶数序列和奇数序列,在一个计数周期,偶数序列由小变大,直到最大值,然后变为对奇数序列计数,变化为由大到小。如图3例子。 奇偶序列的产生方法是将计数器的最后一位作为比较数据的最低位,在一个计数周期内,前半个周期计数器输出最低位为0,其他高位逐次增大,则产生的数据即为偶数序列;后半个周期输出最低位为1,其余高位依次减小,产生的数据为依次减小的偶序列。具体电路可以由以下电路图表示: 三、8051中的PWM模块设计:

按键控制单片机PWM输出设计

学号1322010110 天津城建大学 单片机原理及应用A课程 设计说明书 按键控制单片机PWM输出设计起止日期:2016年05月30日至2016年6月10日 学生姓名 班级 成绩 指导教师(签字) 控制与机械工程学院 2016年6月10日

目录 第一章系统方案设计 (1) 1.1 PWM (1) 1.2 STC12C5A60S2简介 (1) 1.3 仿真工具介绍 (2) 1.3.1 Protues简介 (2) 1.3.2 Keil uVision3简介 (4) 第二章硬件电路设计 (5) 2.1 复位电路 (5) 2.2 时钟电路 (5) 2.3 按键中断 (5) 2.4 显示电路 (6) 第三章程序设计流程图 (7) 第四章系统仿真 (8) 4.1 仿真图 (8) 4.2 程序 (8) 4.3 PCB.................................................................................................................. 错误!未定义书签。参考资料 ....................................................................................................................... 错误!未定义书签。

第一章系统方案设计 1.1 PWM PWM的全称是Pulse Width Modulation(脉冲宽度调制),它是通过改变输出方波的占空比来改变等效的输出电压。 1.2 STC12C5A60S2简介 STC12C5A60S2是STC生产的单时钟/机器周期(1T)的单片机,是高速、低功耗、超强抗干扰的新一代8051单片机,指令代码完全兼容传统8051,但速度快8-12倍。内部集成MAX810专用复位电路,2路PWM,8路高速10位A/D转换,针对电机控制,强干扰场合。 1)管脚说明: 1、P0.0~P0.7 P0:P0口既可以作为输入/输出口,也可以作为地址/数据复用总线使用。当P0口 作为输入/输出口时,P0是一个8位准双向口,内部有弱上拉电阻,无需外接上拉电阻。当P0作为地址/数据复用总线使用时,是低8位地址线A0~A7,数据线D0~D7 2、P1.0/ADC0/CLKOUT2 标准IO口、ADC输入通道0、独立波特率发生器的时钟输出 3、P1.1/ADC1 4、P1.2/ADC2/ECI/RxD2 标准IO口、ADC输入通道2、PCA计数器的外部脉冲输入脚,第二串口数据接收端 5、P1.3/ADC3/CCP0/TxD2 外部信号捕获,高速脉冲输出及脉宽调制输出、第二串口数据发送端 6、P1.4/ADC4/CCP1/SS非 SPI同步串行接口的从机选择信号 7、P1.5/ADC5/MOSI SPI同步串行接口的主出从入(主器件的输入和从器件的输出) 8、P1.6/ADC7/SCLK SPI同步串行接口的主入从出 9、P2.0~P2.7 10、P2口内部有上拉电阻,既可作为输入输出口(8位准双向口),也可作为高8位地址总线使用。 11、P3.0/RxD 标准IO口、串口1数据接收端 12、P3.1/INT0非 外部中断0,下降沿中断或低电平中断 13、P3.3/INT1 14、P3.4/T0/INT非/CLKOUT0 定时器计数器0外部输入、定时器0下降沿中断、定时计数器0的时钟输出 2)A/D转换器的结构: STC12C5A60AD/S2系列带A/D转换的单片机的A/D转换口在P1口,有8路10位高速A/D转换器,速度可达到250KHz(25万次/秒)。8路电压输入型A/D,可做温度检测、电池电压检测、按键扫描、频谱检测等。上电复位后P1口为弱上拉型IO口,用户可以通过软件设置将8路中的任何一路设置为A/D 转换,不须作为A/D使用的口可继续作为IO口使用。 单片机ADC由多路开关、比较器、逐次比较寄存器、10位DAC、转换结果寄存器以及ADC_CONTER

单片机设计PWM三种方式

第一次学单片机,学到PWM 的时候刚好有很多事,就学的很是纠结。今晚不对是今晨,大概三点半有了一点思路,写下来,以飨初学者。 设计思路: A.单纯的通过延时程序,让单片机在某段时间内输出高电平,另一段时间内输出低 电平。思路很简单,但是稳定性有待商榷,频率不可调。 B.利用一个定时器,提高计时精度,if 语句 if(num == 1) // 设定占空比80% { led = 1; } else if(num == 5) { num = 0; led = 0; } 此方法稳定性也不是很高有大概10% 的占空比波动,当然也可以按位取反,不过占空比就只能是50% 了有一个人,做而论道这是他的百度 用户名,很强的一个人,使用三个定时器一个T0 控制频率两个外部中断INT0 INT1 分别控制pwm 的加减并且用数码管输出占空比的级数,程序摘录如 下,调节占空比的部分比较出彩 //========================================== #include unsigned int a, b; // ---------------------------- void main() { TMOD = 0x01; //T0 定时方式 1 TH0 = (65536-50000) / 256; //50ms@12MHz TLO = (65536-50000) % 256; TRO = 1; ET0 = 1; EX0 = 1; EX1 = 1;

IT0 = 1; IT1 = 1; EA = 1; a = 0; b = 10; while(1); } // ---------------------------- void time0() in terrupt 1 { TL0 = (65536-50000) % 256; TH0 = (65536-50000) / 256; 〃50ms@12MHz a++; if(a == 20) a = 0; // 在这里调整周期. if(a < b) P2 = 0xff; // 在这里调整占空比. else P2 = 0x00; P0 = ((b / 10) << 4) + b % 10; // 显示占空比等级 } // ---------------------------- void X0_INT() in terrupt 0 { b++; if(b > 19) b = 19; // 占空比等级最大为19 } // ---------------------------- void X1_INT() in terrupt 2 { b--; if(b < 1) b = 1; // 占空比等级最小为1. } //========================================== 原文链接关于MCS-51单片机实现PW啲方法_做而论道的空间_百度空间 C.在定时器里开启定时器,需要两个定时器,第一个控制频率,第二个控制 占空比稳定性非常高。 #include

51系列单片机输出PWM的两种方法

51系列单片机输出PWM的两种方法 51系列单片机无PWM输出功能,可以采用定时器配合软件的方法输出。对精度要求不高的场合,非常实用。电路图见图一,采用了高速光隔(6N137)输出,并将PWM的信号倒相。 一、原理原理图 图一 二、固定脉宽PWM输出 用T0定时器完成PWM输出,脉宽固定:65536微妙。T0定时器设置成:16位定时器 PWM: 程序清单:(12MHz) PwmData0 ;T0定时t1所需的定时初值(字)

PwmData1 ;T0定时t2所需的定时初值(字) PwmF ;PWM输出标志 ;********************************************************* setb tro ;启动T0 。。。。。。 T0Int:;T0中断服务程序 JB PwmF ,PwmOutH ;PWM输出未完成返回 Mov TH0,High(PwmData0) Mov TL0,Low(PwmData0) Setb tr0 Setb PwmF Clr p1.0 ;PWM输出脚 reti PwmOutH: Setb p1.0 Clr tr0 Mov TH0,High(PwmData1) Mov TL0,Low(PwmData1) Setb tr0 Clr PwmF reti 说明:在主程序中计算PwmData0、PwmData1的值。 三、可变脉宽PWM输出 用T0定时器控制PWM的占空比,T1定时器控制脉宽(最大:65536微妙)。

T0、T1定时器设置成:16位定时器。 程序清单:(12MHz) PwmData0 ;T0定时t1所需的定时初值(字) PwmData1 ;T1定时T所需的定时初值(字);********************************************************* setb tro ;启动T0 setb tr1 。。。。。。 T0Int:;T0中断服务程序 Clr tr0 setb p1.0 ;PWM输出脚 reti T1Int:;T1中断服务程序 Clr p1.0 Clr tr0 Clr tr1 Mov TH0,High(PwmData0)

51单片机输出PWM的两种方法

51单片机输出PWM的两种方法 51系列单片机无PWM输出功能,可以采用定时器配合软件的方法输出。对精度要求不高的场合,非常实用。电路图见图一,采用了高速光隔(6N137)输出,并将PWM的信号倒相。 一、原理图 图一 二、固定脉宽PWM输出 用T0定时器完成PWM输出,脉宽固定:65536微妙。T0定时器设置成:16位定时器 PWM: 程序清单:(12MHz) PwmData0 ;T0定时t1所需的定时初值(字) PwmData1 ;T0定时t2所需的定时初值(字) PwmF ;PWM输出标志 ;********************************************************* SETB TR0 ;启动T0 T0Int:;T0中断服务程序 JB PwmF ,PwmOutH ;PWM输出未完成返回 Mov TH0,High(PwmData0) Mov TL0,Low(PwmData0) Setb tr0 Setb PwmF Clr p1.0 ;PWM输出脚 reti

PwmOutH: Setb p1.0 Clr tr0 Mov TH0,High(PwmData1) Mov TL0,Low(PwmData1) Setb tr0 Clr PwmF reti 说明:在主程序中计算PwmData0、PwmData1的值。 三、可变脉宽PWM输出 用T0定时器控制PWM的占空比,T1定时器控制脉宽(最大:65536微妙)。T0、T1定时器设置成:16位定时器。 程序清单:(12MHz) PwmData0 ;T0定时t1所需的定时初值(字) PwmData1 ;T1定时T所需的定时初值(字) ;********************************************************* setb tro ;启动T0 setb tr1 。。。。。。 T0Int:;T0中断服务程序 Clr tr0 setb p1.0 ;PWM输出脚 reti T1Int:;T1中断服务程序 Clr p1.0 Clr tr0 Clr tr1 Mov TH0,High(PwmData0) Mov TL0,Low(PwmData0) Mov TH1,High(PwmData1) Mov TL1,Low(PwmData1) Setb tr1 Setb tr0 reti 说明:在主程序中计算PwmData0、PwmData1的值。

msp430单片机实现PWM

msp430单片机实现PWM PWM信号是一种具有固定周期(T)不定占空比(t)的数字信号,如下图所示。如果PWM信号的占空比随时间变化,那么通过滤波之后的输出信号将是幅度 变化的模拟信号。因此通过控制PWM信号的占空比,就可以产生不同的模拟 信号。 msp430单片机利用Timer_A或者Timer_B可以很好的实现产生任意PWM 信号。 Timer_A定时器的计数器工作在增计数方式,输出采用模式7(复位/置位模式),则可以利用CCR0控制PWM波形的周期,用某个寄存器CCRx控制占空比。 原理图如下:(注:这幅图片为网上下载,他用的是Timer_B定时器,故输出TBx) 摘录下面一段:www1.ti/customer/article/article12161.asp 将Timer_B配置为16-bit、up模式。在这种模式下计数器计数至CCR0,然 后复位从0开始重新计数。给CCR0赋值255也就意味着计数器的长度为 8bits。CCR1和TB1用于产生正弦波,CCR2和TB2用于产生直流电平。输出模式都选为模式7,即PWM复位/置位模式。如图2所示,在这种模式下,复 位后每一个定时器的输出都为高电平,直到计数器达到各自的CCRx值时变为 低电平,当计数器达到CCR0时再置位。也就是说CCRx的值决定了各自正脉 冲的宽带。若CCRx的值是变化的,就可以产生可变宽度的脉冲,下文中的正 弦波就是用这种办法产生的;若不变则产生的是固定宽度的脉冲,下文中的直 流电平就是这样产生的。最后SMCLK用作Timer_B的时钟源。系统采用 32768Hz的钟表晶振,通过采用内部硬件锁频环FLL(frequency-locked-loop),

通过单片机定时器产生PWM波

通过单片机定时器产生PWM波 PWM(脉宽调制)在很多场合都用得上,例如LED亮度控制,开关电源输出电圧控制等。这里采用简单的定时器实现PWM波输出,通过更改定时器定时参数,控制IO口输出波形高低电平持续时间,实现PWM波。 代码如下: #include #define T0_INTERRUPT 1 //T0中断向量号 #define PWMH_L 0x9C #define PWMH_H 0xFF //PWM低电平时间0.1ms #define PWML_L 0xCE #define PWML_H 0xFF //PWM高电平时间0.05ms sbit LED1 = P1^0; //常亮LED,作为对比,仿真看不出效果 sbit LED2 = P1^1; //PWM驱动LED typedef unsigned char uchar; typedef unsigned int uint; void Init_T0(); void main() { LED1 = 0; //点亮LED1 LED2 = 1; //熄灭LED2 Init_T0(); //初始化定时器0 while(1) { PCON |= 0x01; //单片机进入休眠模式,节省功耗 } } void Init_T0() { TMOD &= 0xF0; TMOD |= 0x01; //16位定时器模式 TH0 = PWML_H;

TL0 = PWML_L; EA = 1; //开全局中断 ET0 = 1; //允许T0中断 TR0 = 1; //启动定时器 } void T0_Interrupt() interrupt T0_INTERRUPT { TF0 = 0; if(LED2 == 1) { LED2 = 0; //设置低电平持续时间,LED2亮 TH0 = PWMH_H; TL0 = PWMH_L; } else { LED2 = 1; //设置高电平持续时间,LED2灭 TH0 = PWML_H; TL0 = PWML_L; } }

基于单片机的PWM输出控制

智能仪表综合训练设计说明书 题目:基于单片机的PWM输出控制 学生姓名: 学号: 专业: 班级: 指导教师:

摘要 随着电子技术及微控制器(MCU)的快速发展,自动控制技术在工业领域应用十分广泛。许多设备之间的连接或者控制都是由标准的1~5V的电压信号或者4~20mA的电流信号来完成的。一般设备的D/A转换都是采用集成的数模转换器,这样就增加了成本,所以为了降低成本,利用单片机内部的定时器和软件一起来实现PWM 输出,经过简单的变换电路就以实现D/A转换。 本次设计,就是基于单片机的PWM输出控制,通过RC硬件电路,采用定时器配合软件的方法实现占空比可调、周期固定的PWM输出控制,大致过程:利用电位器实现占空比的改变,并通过AD转换,将PWM方波的占空比送入LED进行显示。然后,将给定占空比生成的PWM 波形被输入到一个低通滤波器,即将输入的数字信号转换为模拟信号,然后去控制LED灯的渐变。 关键词:单片机;脉宽调制;A/D转换器;LED显示

目录 第一章脉冲宽度调制概述 (1) 1.1 PWM控制的原理及过程 (1) 1.1.1 PWM控制的基本原理 (1) 1.1.2 PWM的控制过程 (2) 1.2 PWM控制的特点及应用 (2) 第二章总体方案设计 (4) 2.1 系统总体的设计思路 (4) 第三章硬件设计 (6) 3.1 STC89C52单片机及控制电路 (6) 3.1.1 STC89C52单片机简介 (6) 3.1.2 单片机时钟和复位电路的设计 (7) 3.2 基于单片机PWM输出控制系统的硬件电路的分析与设计 (9) 3.2.1 电源电路的分析与设计 (9) 3.2.2 MAX232芯片与RS232接口电路 (10) 3.2.3 ADC0832与 A/D转换电路 (11) 3.2.4 LED显示电路 (14) 第四章软件设计 (17) 4.1程序流程图及程序设计 (17) 4.1.1 主程序设计 (17) 4.1.2 A/D转换程序设计 (17) 4.1.3 PWM控制程序设计 (18) 第五章总结 (19) 参考文献 (20) 附录A:基于单片机的PWM输出控制的硬件原理图 (21) 附录B:基于单片机的PWM输出控制的源程序 (22)

单片机输出PWM波

单片机输出PWM波 //*******************函数声明,变量定义******************* #include #include #define uchar unsigned char #define uint unsigned int //端口定义 sfr p0=0x80; sfr p1=0x90; sfr p2=0xa0; sfr p3=0xb0; //键 sbit add_speed=P1^0; sbit sub_speed=P1^1; //PWM控速 uint time_PWM=0; //PWM时间计数 uint high_PWM=0; //PWM高电平时间 uint t_PWM=16; //PWM周期 //*******************延时程序******************* void delayms(unsigned char ms) { unsigned char i ; while(ms--) { for(i = 0 ; i < 120 ; i++) ; } } //*******************键盘扫描程序******************* void key_change() { if(add_speed==0) { delayms(10); if(add_speed==0) { if(high_PWM < 16) { high_PWM++; } } } if(sub_speed==0) {

delayms(10); if(sub_speed==0) { if(high_PWM > 0) { high_PWM--; } } } } //*******************中断程序******************* //PWM波生成,T0中断 void PWM_T0(void) interrupt 1 { TH0=0Xd8; TL0=0Xf0; time_PWM++; if(time_PWM < high_PWM) { p2=0xff; } if(time_PWM==high_PWM) { p2=0x00; } else if(time_PWM==t_PWM) { p2=0xff; time_PWM=0; } } //*******************主程序******************* void main() {p0=0xff; p1=0Xff; p2=0xff; p3=0xff; TH0=0xd8; //定时10us TL0=0xf0; TMOD=0x01; EA=1; ET0=1; TR0=1; while(1) { key_change(); }}

51单片机定时器产生任意占空比PWM

晶振12M任意占空比方波输出 如果是占空比任意,现在考虑12M晶振,所以机器周期Tcy为1 μs。 定时器工作方式1最长定时为65536×1×10-6=65.536ms 如果要输出周期为1s的任意占空比的方波。那可以把1s分为100份,每份中断一次。然后在中断里面计数(比如全局变量num)加一。加到100之后,表示一个周期结束。这样就可以控制每一份的电平的高低了。如果,占空比为30%,那么也就是num小于等于100×30%=30的时候,输出高电平,其余输出低电平就可以了。如果占空比为a(百分号的形式),那么也就是num小于等于100×a的时候输出高电平,其余输出低电平就可以了。 现在考虑定时器的初值如何设定,由于定时器需要在1s/100也就是10ms的时候进入一次中断进行判断。如果采用方式1,那么因为(216 ?X) ? 1 ? 10?6 = 10 ? 10?3, 所以定时器的初值为X=65536 – 1000. #include //头文件 sbit output=P1^1; //输出端 unsigned char num=1; //辅助计时 unsigned int a = 0.3;占空比a可以任意设定 void Init(void) //初始化函数 { //对于定时器一般初始化需要六步 TMOD=0x01; TH0=(65536-1000)/256; //(65536-1000)为定时器初值,定时10ms TL0=(65536-1000)%256; EA=1; ET0=1; TR0=1; } main() { Init(); while(1) { if(num<=100*a)output=1; //使占空比为a else output=0; } } void Timer_0(void) interrupt 1 //中断函数 { TH0=(65536-1000)/256; // TL0=(65536-1000)%256; num++; if(num>100) num=1; }

如何采用STM32单片机来产生PWM输出

如何采用STM32单片机来产生PWM输出 1. TIMER输出PWM基本概念 脉冲宽度调制(PWM),是英文“Pulse Width ModulaTIon”的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。简单一点,就是对脉冲宽度的控制。一般用来控制步进电机的速度等等。 STM32的定时器除了基本定时器TIM6和TIM7之外,其他的定时器都可以用来产生PWM 输出,其中高级定时器TIM1和TIM8可以同时产生7路的PWM输出,而通用定时器也能同时产生4路的PWM输出。 1.1 PWM输出模式 STM32的PWM输出有两种模式,模式1和模式2,由TIMx_CCMRx寄存器中的OCxM 位确定的(“110”为模式1,“111”为模式2)。模式1和模式2的区别如下: 110:PWM模式1-在向上计数时,一旦TIMx_CNTTIMx_CCR1时通道1为无效电平(OC1REF=0),否则为有效电平(OC1REF=1)。 111:PWM模式2-在向上计数时,一旦TIMx_CNTTIMx_CCR1时通道1为有效电平,否则为无效电平。 由此看来,模式1和模式2正好互补,互为相反,所以在运用起来差别也并不太大。 而从计数模式上来看,PWM也和TIMx在作定时器时一样,也有向上计数模式、向下计数模式和中心对齐模式,关于3种模式的具体资料,可以查看《STM32参考手册》的“14.3.9 PWM模式”一节。 1.2 PWM输出管脚 PWM的输出管脚是确定好的,具体的引脚功能可以查看《STM32参考手册》的“8.3.7 定时器复用功能重映射”一节。在此需要强调的是,不同的TIMx有分配不同的引脚,但是考虑到管脚复用功能,STM32提出了一个重映像的概念,就是说通过设置某一些相关的寄存器,来使得在其他非原始指定的管脚上也能输出PWM。但是这些重映像的管脚也是由参考手册给出的。比如说TIM3的第2个通道,在没有重映像的时候,指定的管脚是PA.7,

如何利用单片机输出PWM波

如何利用51单片机输出PWM波 1、理论知识 PWM这个功能在飞思卡尔、STM32等高档的单片机内部有专用的模块,用此类芯片实现PWM功能时只需要通过设置相应的寄存器就可实现周期和占空比的控制。但是如果要用51单片机的话,也是可以的,但是比较的麻烦。此时需要用到内部定时器来实现,可用两个定时器实现,也可以用一个定时器实现。 用两个定时器的方法是用定时器T0来控制频率,定时器T1来控制占空比。大致的的编程思路是这样的:T0定时器中断让一个I0口输出高电平,在这个定时器T0的中断当中起动定时器T1,而这个T1是让IO口输出低电平,这样改变定时器T0的初值就可以改变频率,改变定时器T1的初值就可以改变占空比。 下面重点介绍用一个定时器的实现PWM的方法。因为市面上的智能小车所采用的电机大多数为TT减速电机,通过反复的实验,此电机最佳的工作频率为1000HZ(太高容易发生哨叫,太低电机容易发生抖动),所以下面以周期为1ms(1000HZ)进行举例,要产生其它频率的PWM波,程序中只需作简单修改即可。 用一个定时器时(如定时器T0),首先你要确定PWM的周期T和占空比D,确定了这些以后,你可以用定时器产生一个时间基准t,比如定时器溢出n次的时间是PWM的高电平的时间,则D*T=n*t,类似的可以求出PWM低电平时间需要多少个时间基准n'。 因为这里我们是产生周期为1ms(1000HZ)的PWM,所以可设置中断的时间间隔为0.01ms,,然后中断100次即为1ms。在中断子程序内,可设置一个变量如time,在中断子程序内,有三条重要的语句:1、当time>=100时,time清零(此语句保证频率为1000HZ),2、当time>n时(n应该在0-100之间变化开),让单片相应的I/O口输出高电平,当time #define uint unsigned int #define uchar unsigned char sbit PWM1=P2^0;//接IN1 控制正转

利用单片机定时器实现信号采样和PWM控制

利用单片机定时器实现信号采样和PWM控制 PWM控制方式广泛应用于各种控制系统中,但对脉冲宽度的调节一般采用硬件来实现。如使用PWM控制器或在系统中增加PWM电路[1]等,则成本高、响应速度慢,而且PWM控制器与系统之间存在兼容问题。另外,控制系统中的信号采样通常是由A/D转换器来完成,因此检测精度要求较高时,调理电路复杂,而且因A/D的位数高,从而使设计的系统成本居高不下。 本文以应用于温度控制系统为例,介绍利用Motorola公司生产的新型单片机MSP430F413内的定时器Time_A 设计可以用时间量进行温度采样以及实现PWM调节的方法。为了可在使用少量外围电路的情况下实现控制系统的高精度测量和控制,一方面用时间量采样,在省去1片A/D的情况下得到12位的高精度;另一方面在定时中断内完全用软件实现PWM调节,以易于进行数据的通信和显示。该系统在中断内可以解决波形产生的实时在线计算和计算精度问题,可精确、实时地计算设定频率下的脉冲宽度。 1 单片机MSP430F413及定时器 MSP430系列的单片机F413在超低功耗和功能集成上都有一定的特色,可大大减小外围电路的复杂性,它的实时处理能力及各种外围模块使其可应用在多个低功耗领域[2]。MSP430F413中通用16位定时器Timer_A有如下主要功能模块。 (1)一个可连续递增计数至预定值并返回0的计数器。 (2)软件可选择时钟源。 (3)5个捕获/比较寄存器,每个有独立的捕获事件。 (4)5个输出模块,支持脉宽调制的需要。 定时器控制寄存器TACTL的各位可控制Timer_A的配置,并定义16位定时器的基本操作,可选择原始频率或分频后的输入时钟源及4种工作模式。另外还有清除功能和溢出中断控制位。5个捕获/比较寄存器CCRx的操作相同,它们通过各自的控制寄存器CCTLx进行配置。 2 时间量采样及PWM控制的实现原理 以应用于温度控制系统为例,介绍用定时器实现信号采样和PWM控制的方法。该温度控制系统包括单片机、温度测量电路、负载驱动电路及电源控制、低电压检测和显示电路等其他外围部分。 单片机MSP430F413中用于测量和控制温度的主要I/O口有: P1.0:输出50Hz方波,用于产生三角波。 P1.2:驱动温度控制执行元件,2kHz方波PWM输出。 P2.0:脉宽捕捉。 2.1 单片机端口的中断设置

单片机定时器生成频率占空比可调的PWM

关于51系列单片机利用定时器生成频率占空比可调的PWM 利用51单片机(无PWM模块)的软件模拟生成PWM,其频率和占空比都是可调的,在去年电子竞赛的时候一直没有自己尝试过,现在到了13的五月,要准备电子竞赛了,想把一些比较基础的东西自己亲手调一调。 在刘海波老师的单片机课,听过老师的方法生成PWM,当时就是一惊!自己从来没有这么做过。原理比较简单,下面分别阐述: 自己的想法,要用到两个定时器,一个用于控制占空比,一个用于控制周期,即频率 例如:t0控制高电平(或者)维持的时间,t1控制低电平(或者高电平)维持的时间,两者的时间的之和就是该PWM的周期,考虑到单片机上电引脚的电平的问题,此时生成的PWm的最好是先高后低。往往第一个周期是不对的。以下下就详细说明: 单片机上电为高电平,开始t0定时器和相关中断设置,等到t0定时时间T0到了,进入中断程序,变为低电平,同时关掉t0和开启t1,即是TR0=0,TR1=1;同理t1定时时间T1到了,进入中断程序,变为低电平,同时关掉t1和开启t0,即是TR0=1,TR1=0;即是即是采用定时器t0、t1轮流定时,一个定时器控制一种电平的时间,t0为高电平定时的时间,t1为低电平定时的时间。 注意:这个方法在系统的初始化的时候,必须将t0的定时器开启,否则,全部无法进行还有一种方法是开始t0定时器、t1定时器同时开启,其中t0定时的时间T0是高电平的时间,t1定时的时间T1是整个PWM的周期。开始t0定时器、t1定时器同时开启,当然,T0的时间肯定要比T1的大,当t0定时的时间T0到了,进入t0中断程序,引脚又高电平变到低电平,同时将t0定时器关掉;当t1定时的时间T1到了,进入t1中断程序,引脚又低电平变到高电平,同时将t0定时器开启。

微芯单片机PWM模块调试程序

#include "p33ep64mc206.h" void init_PWM(); int main(void) { // Configure Oscillator to operate the device at 40Mhz // Fosc= Fin*M/(N1*N2), Fcy=Fosc/2 // Fosc= 8M*40/(2*2)=80Mhz for 8M input clock PLLFBD=38; // M=40 CLKDIVbits.PLLPOST=0; // N1=2 CLKDIVbits.PLLPRE=0; // N2=2 OSCTUN=0; // Tune FRC oscillator, if FRC is used // FOSCSEL=0xFF7A; // FOSC=oxFF1A; // Disable Watch Dog Timer RCONbits.SWDTEN=0; // Clock Switch to incorporate PLL __builtin_write_OSCCONH(0x01); // Initiate Clock Switch to FRC with PLL (NOSC=0b001) __builtin_write_OSCCONL(0x01); // Start clock switching while (OSCCONbits.COSC!= 0b001); // Wait for Clock switch to occur // Wait for PLL to lock while(OSCCONbits.LOCK!=1) {}; /* Now setup the ADC and PWM clock for 120MHz ((FRC * 16) / APSTSCLR ) = (7.37 * 16) / 1 = ~ 120MHz*/ // ACLKCONbits.FRCSEL =

相关文档
最新文档