第7章中断控制定时计数器及PCAPWM的应用
- 格式:ppt
- 大小:4.18 MB
- 文档页数:8
PWM模块及应用本文介绍的PWM模块是基于TMS320F2808。
对其模块的主要构成和功能进行了介绍,并利用该模块产生了给定频率的SPWM波。
F2808ePWM模块包含2组完整的ePWM模块:ePWMxA和ePWMxB。
如下图所示,这些ePWM模块通过一个同步时钟信号联系在一起,当需要的时候可以将这些模块看做是分开对立的系统。
对于产生单相的SPWM波,使用ePWM1模块即可。
ePWM模块包含以下子模块:时基子模块、计数子模块、动作限定子模块、死区生成子模块、PWM输出断路器子模块、TZ子模块、事件触发子模块。
每个ePWM模块的详细电路框图如下:1、 时基子模块与PWM 周期的确定每个ePWM 都有自己独立的时基子模块这些时基子模块确定了每个ePWM 模块的事件时间。
这些ePWM 模块在同步时钟下是独立的系统。
PWM 的周期和频率由时基周期寄存器(TPBRD )的值和时基计数器的模式共同的决定。
选择连续增减计数模式则周期为:TBCLK T TPBRD T ⨯⨯=2对于一个调制波为30Hz 的正弦波,开关频率为20KHz ,令时基时钟的分频值等于系统时钟的值为100MHz 。
此时TPBRD 的值应该为2500。
时基相位寄存器设置为0。
2、比较计数子模块比较数子模块将时基计数器的值与比较计数器的值进行比较,当时基计数器的值与比较计数器的值相等时,比较计数子模块将产生相应的事件。
比较计数子模块通过2个比较计数器来产生2个独立的比较事件,对于增减计数模式,当比较计数器的值在0-TPBRD之间时,每个周期发生两次比较事件。
这些事件将送到动作限定子模块去。
对于SPWM的生成,通过改变计数比较器的值就产生了正弦的调制波。
利用这两个比较器变可以产生单相的SPWM波。
3、动作限定子模块对于SPWM的生成,通过改变计数比较器的值就产生了正弦的调制波。
利用这两个比较器变可以产生单相的SPWM波。
动作限定子模块对PWM波形的产生有重要的作用,它将不同的事件转换为不同的动作,产生不同波形的ePWM输出。
STC12C5410AD系列单片机器件手册 --- 1个时钟/机器周期8051 ---无法解密 ---低功耗,超低价 ---高速,高可靠 ---强抗静电,强抗干扰STC12C5412, STC12C5412ADSTC12C5410, STC12C5410ADSTC12C5408, STC12C5408ADSTC12C5406, STC12C5406ADSTC12C5404, STC12C5404ADSTC12C5402, STC12C5402ADSTC12LE5412,STC12LE5412ADSTC12LE5410,STC12LE5410ADSTC12LE5408,STC12LE5408ADSTC12LE5406,STC12LE5406ADSTC12LE5404,STC12LE5404ADSTC12LE5402,STC12LE5402AD技术支援:宏晶科技(深圳) www.MCU-Memory.com support@MCU-Memory.comUpdate date: 2006-4-15 (请随时注意更新)宏晶科技:专业单片机/存储器供应商 www.MCU-Memory.com STC12C5410AD系列 1T 8051单片机中文指南2领导业界革命 覆盖市场需求宏晶科技是新一代增强型8051单片机标准的制定者,致力于提供满足中国市场需求的世界级高性能单片机技术,在业内处于领先地位,销售网络覆盖全国。
在保证质量的基础上,以极低的价格和完善的服务赢得了客户的长期信赖。
在广受欢迎的STC89C51全系列单片机的基础上,现全力推出“1个时钟/机器周期”的单片机,全面提升8051单片机性能。
欢迎海内外厂家前来洽谈合作!新客户请直接联系深圳,以获得更好的技术支持与服务。
STC 12C5410AD系列 1T 8051 单片机 新客户请直接联系深圳以获得更好的技术支持和服务 欢迎海内外厂家前来洽谈合作 传真至深圳申请STC单片机 样片及ISP下载线/编程工具●高速:1个时钟/机器周期,RISC型8051内核,速度比普通8051快12倍●宽电压:5.5~3.4V,2.0~3.8V(STC12LE5410AD系列)●低功耗设计:空闲模式,掉电模式(可由外部中断唤醒)●工作频率:0~35MHz,相当于普通8051:0~420MHz ---实际可到48MHz,相当于8051: 0~576MHz●时钟:外部晶体或内部RC振荡器可选,在ISP下载编程用户程序时设置●12K/10K/8K/6K/4K/2K字节片内Flash程序存储器,擦写次数10万次以上●512字节片内RAM数据存储器●芯片内E2PROM功能●ISP / IAP,在系统可编程/在应用可编程,无需仿真器●10位ADC,8通道,STC12C2052AD系列为8位ADC●4通道捕获/比较单元(PWM/PCA/CCU),STC12C2052AD系列为2通道 ---也可用来再实现4个定时器或4个外部中断(支持上升沿/下降沿中断)●2个硬件16位定时器,兼容普通8051的定时器。
单片机中断系统和定时计数器在单片机的世界里,中断系统和定时计数器就像是两个得力的助手,为单片机的高效运行和精确控制发挥着至关重要的作用。
接下来,让我们一起深入了解一下这两个重要的概念。
首先,咱们来聊聊中断系统。
想象一下,单片机正在专心致志地执行着一个任务,突然有个紧急情况发生了,比如外部设备传来了一个重要的数据需要立即处理。
这时候,中断系统就像是一个“紧急警报器”,让单片机暂停当前的任务,迅速去处理这个紧急情况。
处理完之后,再回到原来被中断的地方继续执行之前的任务。
中断系统的好处那可太多了。
它大大提高了单片机的工作效率。
要是没有中断,单片机就得一直按照顺序依次执行任务,可能会错过一些关键的信息或者无法及时响应紧急事件。
有了中断,单片机就能在多个任务之间灵活切换,做到“分身有术”。
中断系统一般由中断源、中断允许控制、中断优先级控制和中断响应等部分组成。
中断源就是那些能引起中断的事件,比如外部中断、定时器中断、串口中断等等。
中断允许控制就像是一道“开关”,决定了是否允许某个中断源发出中断请求。
中断优先级控制则是用来确定当多个中断同时发生时,先处理哪个中断,后处理哪个中断。
再来说说定时计数器。
在很多实际应用中,我们经常需要对时间进行精确的测量和控制,这时候定时计数器就派上用场了。
比如说,我们要控制一个小灯每隔1 秒钟闪烁一次,或者要统计外部脉冲的个数,都可以用定时计数器来实现。
定时计数器的工作原理其实并不复杂。
它就像是一个不断计数的“小闹钟”。
可以设置为定时模式或者计数模式。
在定时模式下,它根据单片机内部的时钟信号进行计数,当计数值达到设定的值时,就会产生一个定时中断。
在计数模式下,它对外部输入的脉冲进行计数,当计数值达到设定值时,也会产生中断。
比如说,我们要实现一个 1 毫秒的定时,假设单片机的时钟频率是12MHz,那么一个机器周期就是 1 微秒。
如果我们要定时 1 毫秒,就需要设置定时计数器的初值,让它经过 1000 个机器周期后产生中断。
STCMCU的软件和硬件PCAPWM输出软件⽅式输出PWMPWM⽤于输出强度的控制, 例如灯的亮度, 轮⼦速度等, STC89/90系列没有硬件PWM, 需要使⽤代码模拟使⽤纯循环的⽅式实现PWM⾮中断的实现(SDCC环境编译)#include <8052.h>#define Led10 P0_7typedef unsigned int u16;int atime = 64;// 仅作为延时, pms取值区间为 0 - 64void delay(u16 pms) {u16 x, y;for (x=pms; x>0; x--) {for (y=11; y>0; y--);}}// 这⾥控制占空⽐, i取值区间为 0 - 64,// i越⼤脉冲宽度越低, 因为输出是低位点亮, 所以i越⼤LED越亮void ledfade(u16 i) {Led10 = 0;delay(i);Led10 = 1;delay(atime-i);}int main(void) {u16 a, b;// 每个循环, ⼩灯while(1) {// a增⼤, 脉冲宽度降, 亮度增for (a=0; a<atime; a++) {for (b=0; b < (atime - a)/4; b++) {ledfade(a);}}// a减⼩, 脉冲宽度增, 亮度降for (a=atime; a>0; a--) {for (b=0; b < (atime - a)/4; b++) {ledfade(a);}}}}使⽤中断的⽅式因为需要PWM输出的场景, ⼀般都不会仅仅有PWM输出, 所以通常会做到定时器中断中, 由中断来实现将1和0的时间宽度设置为定时器, 直接做到定时器中断⾥⾯这个代码中1. pwm_flag代表了输出的0和1, 每次定时器中断时进⾏切换, 并设置下⼀次中断的时间宽度2. 缺点: ⽤TR0做开关, 但是这种停⽌⽅式, 停⽌后输出可能还是1/* Global variables and definition */#define PWMPIN P1_0unsigned char pwm_width;bit pwm_flag = 0;void pwm_setup(){TMOD = 0; // Timer mode 0, 13bitpwm_width = 160;EA = 1;ET0 = 1;TR0 = 1;}/* Timer 0 Interrupt service routine */void timer0() interrupt 1{if (!pwm_flag) { /* Start of High level */pwm_flag = 1; /* Set flag */PWMPIN = 1; /* Set PWM o/p pin */TH0 = pwm_width; /* Load timer */TF0 = 0; /* Clear interrupt flag */} else { /* Start of Low level */pwm_flag = 0; /* Clear flag */PWMPIN = 0; /* Clear PWM o/p pin */TH0 = 255 - pwm_width; /* Load timer */TF0 = 0; /* Clear Interrupt flag */}}void pwm_stop(){TR0 = 0; /* Disable timer to disable PWM */}使⽤定时器模式2和中断实现的PWM输出使⽤定时器⼯作模式2定时器通过对变量tt做计数, 与scale做⽐较, 确定是否翻转电压这⾥scale分10个等级, scale=1时占⽐1/10个PWM周期(250us * 10 = 2.5ms), 在主循环⾥改变scale因为是低电平点亮LED, 所以tt<=scale的时间LED是暗的, scale增⼤时亮度变⼩, 这个可以根据⾃⼰电路的情况调整这样存在的问题是修改scale的值时, 可能正好在tt计数范围的中间, 导致输出出现⽑刺, 可以通过增加⼀个中间变量来解决, 在tt计数时⽐较的是这个中间变量, 在周期结束时再⽤新值更新这个中间变量#include<reg51.h>sbit P10 = P1^0;sbit P11 = P1^1;unsigned int scale; //占空⽐控制变量void main(void) {unsigned int n; //延时循环变量TMOD = 0x02; //定时器0,⼯作模式2, 8位定时, TL0溢出时⾃动重载TH0中的值TH0 = 0x06; //定时, 250us⼀个中断 (12M晶振, 12分频后1MHz, 单次1us)TL0 = 0x06; //初始值TR0 = 1; //启动定时器0ET0 = 1; //启动定时器0中断EA = 1; //开启总中断while(1) {for(n = 0; n < 50000; n++); //延时50msscale++; //占空⽐控制, ⾃增if(scale == 10) scale = 0; //使占空⽐从0-10循环变化}}timer0() interrupt 1 {static unsigned int tt; //tt⽤来保存当前时间在⼀个时钟周期的位置tt++; //每中断⼀次,即每经过250us,tt的值⾃加1if (tt == 10) { //中断10次定时2.5mstt = 0; //使tt=0,开始新的周期,达到循环的效果P10 = 0; //点亮LED}if (tt <= scale) { //如果占空⽐与中断次数相同时,此时输出⾼电平P10 = 1; //熄灭LED灯}}使⽤定时器模式2和中断实现的多路PWM输出实现多路PWM输出的思路1. 使⽤⼀个基础定时器, 定时器时间不能太⼤, 例如设置为100us, 可以⽤定时器模式2, 这样初始值能⾃动重置2. 设定⼀个PWM周期, 这个周期就是定时器间隔的整数倍, 例如10倍定时器周期, 就是1000us = 1ms3. 对于每个PWM通道设置⼀个计数, 计数在达到PWM周期时置零, 这是实现PWM周期的基础设置⼀个初始输出, ⾼电平或低电平设置⼀个输出宽度, 计数达到这个宽度值时翻转. 这个宽度决定了输出翻转的时间, ⽤于控制占空⽐4. 因为每个指令的执⾏时间需要1-2个CPU周期, 所以当通道数增加后, 误差会增⼤代码例⼦: 这⾥⽤8个位指定4个轮⼦的PWM输出, 每个轮⼦两位是为了控制轮⼦的正反向#include <reg52.h>typedef unsigned int u16;typedef unsigned char u8;// Wheel 0sbit P1_0 = P1^0;sbit P1_1 = P1^1;// Wheel 1sbit P1_2 = P1^2;sbit P1_3 = P1^3;// Wheel 2sbit P1_4 = P1^4;sbit P1_5 = P1^5;// Wheel 3sbit P1_6 = P1^6;sbit P1_7 = P1^7;/*Duty Cycle = Toogle_P1_x / PWM_Period;*/u8 PWM_Period = 128; // PWM Period = N * Timer delay(100us), between 10 - 254 u8 Toggle_W0 = 0; // Toggle of Wheel 0u8 Dir_W0 = 0; // Direction, 0:P1_0=0,P1_1=PWM, 1:P1_1=0,P1_0=PWMu8 Toggle_W1 = 0; // Toggle of Wheel 1u8 Dir_W1 = 0; // Direction, 0:P1_2=0,P1_3=PWM, 1:P1_3=0,P1_2=PWMu8 Count_W0, Count_W1;void Time0_Init(void){TMOD = 0x02; // Mode 2, 8-bit and auto-reloadTH0 = 0x9C; // 0x9c = 156, timer of 100us (12MHz OSC)TL0 = 0x9C;ET0 = 1;EA = 1;TR0 = 1;EX0 = 1; EX1 = 1; // Enable external interrupt 0 and 1IT0 = 1; IT1 = 1; // Toggle = jump}void main(){Time0_Init();while(1);}void Timer0_IT() interrupt 1{// W0if(Count_W0 == Toggle_W0) {if (Dir_W0 == 0) { // P1_1=PWMP1_1 = 0;} else { // P1_0=PWMP1_0 = 0;}}if(Count_W0 == PWM_Period - 1) {Count_W0 = 0;if (Dir_W0 == 0) {P1_0 = 0;P1_1 = 1;} else {P1_0 = 1;P1_1 = 0;}} else {Count_W0++;}// W1if(Count_W1 == Toggle_W1) {if (Dir_W1 == 0) { // P1_3=PWMP1_3 = 0;} else { // P1_2=PWMP1_2 = 0;}}if(Count_W1 == PWM_Period - 1) {Count_W1 = 0;if (Dir_W1 == 0) {P1_2 = 0;P1_3 = 1;} else {P1_2 = 1;P1_3 = 0;}} else {Count_W1++;}}// W0 dir0->maxvoid W0_dir0(void){if (Dir_W0 == 0) {Toggle_W0++;if(Toggle_W0 > PWM_Period) { Toggle_W0 = PWM_Period; }} else {Toggle_W0--;if(Toggle_W0 == 0) {Dir_W0 = 0;}}}// W0 dir1->maxvoid W0_dir1(void){if (Dir_W0 == 0) {Toggle_W0--;if(Toggle_W0 == 0) {Dir_W0 = 1;}} else {Toggle_W0++;if(Toggle_W0 > PWM_Period) { Toggle_W0 = PWM_Period; }}}// W1 dir0->maxvoid W1_dir0(void){if (Dir_W1 == 0) {Toggle_W1++;if(Toggle_W1 > PWM_Period) { Toggle_W1 = PWM_Period; }} else {Toggle_W1--;if(Toggle_W1 == 0) {Dir_W1 = 0;}}}// W1 dir1->maxvoid W1_dir1(void){if (Dir_W1 == 0) {Toggle_W1--;if(Toggle_W1 == 0) {Dir_W1 = 1;}} else {Toggle_W1++;if(Toggle_W1 > PWM_Period) { Toggle_W1 = PWM_Period; }}}void IT0_INT() interrupt 0{W1_dir0();}void IT1_INT() interrupt 2{W1_dir1();}硬件PWM51系列单⽚机的增强型版本, 有些带PCA(Programmable Counter Array 可编程计数序列)模块, 可以通过PCA实现PWM的输出.PCA介绍PCA其实就是⼀个增强型的计数器, 这个计数器中的⼀些元素是可以在代码中设置的, 例如可以设置的计数脉冲源, 可以来⾃于系统时钟, 系统时钟可以是不分频, 2分频, 4分频, 6分频, 8分频等; 来⾃计数器; 来⾃外部输⼊的时钟可以设置计数的触发条件, 上升沿还是下降沿, 或者都计数. 最后这个计数⽅式, 可以⽤来计算脉宽可以设置16位的⽐较值不占⽤CPU资源, 这点很重要, 可以使输出更加精确和稳定因为上⼀点, 有些型号可以做到在CPU处于IDLE状态时继续计数(输出)可以⽤PCA实现PWM输出功能STC12C5A60S2系列PCA实现的PWM参考STC12C5A60S2的⼿册有两路输出, 默认PWM0:P1.3, PWM1:P1.4, 可以换到P4⼝: PWM0:P4.2, PWM1:P4.3这个在AUXR1⾥⾯控制两路共⽤PCA定时器, 定时器的频率由CMOD控制因为PWM输出是8位的, 所以定时器的频率/256就是PWM频率两路输出的占空⽐是独⽴变化的, 与当前的[EPCnL, CCAPnL]的值有关前者的值在 PCA_PWM0 PCA_PWM1 ⾥控制后者的值在 CCAP0L,CCAP0H 和 CCAP1L,CCAP1H ⾥控制先输出低, 当CL的值⼤于等于[EPCnL, CCAPnL]时, 输出为⾼当CL由FF变为00时, 输出变低, 同时⾃动将[EPCnH, CCAPnH]的值装载到[EPCnL, CCAPnL], 实现⽆⼲扰更新PWM占空⽐下⾯的代码中, CCAP1H 控制的就是装载值, CCAP1L 控制的是⽐较值, PCA_PWM1 控制的是EPCnH 和 EPCnL如果 EPCnL = 0, 那么正常输出如果 EPCnL = 1, 那么会⼀直输出低电平#include <STC12C5A60S2.H>void main() {CCON = 0; // Initial PCA control register// PCA timer stop running// Clear CF flag// Clear all module interrupt flagCL = 0; // Reset PCA base timerCH = 0;CMOD = 0x02; // Set PCA timer clock source as Fosc/2// Disable PCA timer overflow interruptCCAP0H = CCAP0L = 0x80; // PWM0 port output 50% duty cycle suquare waveCCAPM0 = 0x42; // PCA module-0 as 8-bit PWM, no PAC interruptCCAP1H = CCAP1L = 0xFF; // PWM1port output 0% duty cycle square wavePCA_PWM1 = 0x03; // PWM will keep low levelCCAPM1 = 0x42; // PCA module-0 as 8-bit PWM, no PAC interruptCR = 1; // PCA timer start runwhile(1);}对PCA_PWM1的说明;PCA_PWMn: 7 6 5 4 3 2 1 0; EBSn_1 EBSn_0 - - - - EPCnH EPCnL;B5-B2: 保留;B1(EPCnH): 在PWM模式下,与CCAPnH组成9位数。
空心杯电机的PWM调制及PI控制方法摘 要:由于空心杯无刷直流电动机的独特结构,使它具有体积小、响应速度快、拖动性能好等优点,被广泛地应用于国民经济的各个领域。
本文就如何运用PWM调制和PI控制对空心杯电机进行调速进行了研究和探讨。
关键词: 空心杯无刷直流电动机;脉宽调制;比例积分控制;The PWM and PI Control Method of the Drug Cup MotorZhao huaAbstract:Because of the special construction of the drag cup brushless DC motor, it owns s mall capacity, high response speed, good drive performance, etc. It is widely used in each f ield of national economy. This dissertation will carry on how to apply PWM and PI control in to velocity modulation.Key words: drag cup brushless DC motor; PWM; PI control;1引言空心杯无刷直流电机保持着有刷直流电机的优良机械及控制特性,在电磁结构上和有刷直流电机一样,但它的电枢绕组放在定子上,转子上放置永久磁钢。
空心杯无刷直流电机的电枢绕组像交流电机的绕组一样,采用多相形式,经由逆变器接到直流电源上,定子采用位置传感器或无位置传感器技术实现电子换向代替有刷直流电机的电刷和换向器,各项逐次通电产生电流,和转子磁极主磁场相互作用,产生转矩,使电机旋转[1]。
和有刷直流电机相比,空心杯无刷直流电机由于消除了电机滑动接触机构,因而消除了故障的主要根源。
转子上没有绕组,也就没有了电的损耗[1]。
P89LV51RD2器件手册1. 概述P89LV51RD2是一款80C51微控制器,包含64kB Flash和1024字节的数据RAM。
P89LV51RD2的典型特性是它的X2方式选项。
设计者可通过该特性来选择应用程序以传统的80C51时钟频率(每个机器周期包含12个时钟)或X2方式(每个机器周期包含6个时钟)的时钟频率运行,其中,选择X2方式可在相同时钟频率下获得2倍的吞吐量。
从该特性获益的另一种方法是将时钟频率减半来保持特性不变,这样可以极大地降低EMI。
Flash程序存储器支持并行和串行在系统编程(ISP)。
并行编程方式提供了高速的分组编程(页编程)方式,可节省编程花费和推向市场的时间。
ISP允许在软件控制下对成品中的器件进行重复编程。
应用固件的产生/更新能力实现了ISP的大范围应用。
P89LV51RD2也可采用在应用中编程(IAP),允许随时对Flash程序存储器重新配置,即使应用程序正在运行时也不例外。
2. 特性80C51核心处理单元;3V的工作电压,操作频率为0~33MHz;64kB的片内Flash程序存储器,具有ISP(在系统编程)和IAP(在应用中编程)功能;通过软件或ISP选择支持12时钟(默认)或6时钟模式;SPI(串行外围接口)和增强型UART;PCA(可编程计数器阵列),具有PWM和捕获/比较功能;4个8位I/O口,含有3个高电流P1口(每个I/O口的电流为16mA);3个16位定时器/计数器;可编程看门狗定时器(WDT);8个中断源,4个中断优先级;2个DPTR寄存器;低EMI方式(ALE禁能);兼容TTL和CMOS逻辑电平;掉电检测;低功耗模式掉电模式,外部中断唤醒;空闲模式;PDIP40,PLCC44和TQFP44的封装;3. 定购信息表1 定购信息类型号封装名称描述版本P89LV51RD2BAPLCC44 塑料行间芯片运载,44脚 SOT187-2P89LV51RD2FAP89LV51RD2BBC TQFP44塑料小型方块扁平封装;44脚SOT376-1P89LV51RD2BN PDIP40塑料双列直插;40脚SOT129-1表2 定购选项类型号 温度范围 频率P89LV51RDBA 0℃~+70℃ P89LV51RD2FA -40℃~+85℃ P89LV51RD2BBC 0℃~+70℃ P89LV51RD2BN 0℃~+70℃0~33MHz4.功能框图图1 P89LV51RD2功能框图5.1 管脚RSTNCINT0/P3.2T0/P3.4T1/P3.5图2PLCC44管脚配置INT0/P3.2INT1/P3.3图4 TQFP44管脚配置5.2 管脚描述表3 P89LV51RD2管脚描述管脚符号DIP40 TQFP44 PLCC44类型描述P0.0~P0.7 39~32 37~30 43~36 I/O P0口:P0口是一个开漏双向I/O口。
STC单片机PWM应用以下文字STC8G为范本,进行说明。
STC8G系列单片机PWM模块是和PCA模块、CCP模块复用的。
STC8G内部有3组PWM脉宽调制输出模块。
脉宽调制是使用程序来控制波形的占空比、周期、相位波形的一种技术,在三相电机驱动、D/A转换等场合有广泛的使用。
1.基本寄存器PWM在本质上是计时器和比较器的组合,它需要设定目标计数值,然后由计时器进行计数,将计数的值和目标计数值进行比较,当计数值和目标计数值相等时,就要操作输出信号。
MCU是通过寄存器来设置控制PWM的。
图一既然要计时,就要有一个基本时钟,而PWM通常会使用MCU的系统时钟作为基准,MCU提供对PWM的时钟的设置,这些设置通常是做选择题,就是在MCU时钟的基础上,来选择进行什么样的分频。
STC8G 系列单片机也不例外。
PCA的模式寄存器——CMOD,就提供了一个时钟控制选择的接口,如图一所示。
此外,同样计时还需要一个计时寄存器用来保存当前的经历了多少时间,还要有目标时间。
这些都是通过寄存器来操控的。
在STC8G 系列单片机中,计时寄存器有两个——CL和CH,每个寄存器都是8位的。
根据PWM的位数不同,选择CH、CL中有效的位。
在PCA的每个时钟内,计时寄存器的内容会增1。
而存放目标时间的寄存器,就多样一些,是根据PWM的位数不同而不同的。
这里只描述两种,一种是8位的PWM,存放目标计时数的寄存器是分散到两个寄存器中的,一个是CCAPnL做为低8位(n是PWM的通道号),还有一部分是在寄存器PCA_PWMn的bit0位,这一位主要是为了方便持续输出0或者1。
另外一种是10位的PWM,它的计数也分散在CCAPnL寄存器和PCA_PWMn寄存器中。
CCAPnL为低8位,PCA_PWMn中XCCAPnL[1:0]是Bit9和Bit10,以及EPCnL做为Bit11。
为了方便PWM的重复操作,PWM还有一个与计时寄存器对应的重载寄存器,目标时间寄存器的值是从重载从重载寄存器中复制过去的。
《单片机原理与应用》实验报告姓名:学号:实验名称:班级:电信二班一、实验工具、器材Proteus仿真软件,Keil程序编写软件,示波器,AT89C51单片机二、实验原理a)脉宽调制(PWM)基本原理:控制方式就是对逆变电路开关器件的通断进行控制,使输出端得到一系列幅值相等的脉冲,用这些脉冲来代替正弦波或所需要的波形。
也就是在输出波形的半个周期中产生多个脉冲,使各脉冲的等值电压为正弦波形,所获得的输出平滑且低次谐波少。
按一定的规则对各脉冲的宽度进行调制,即可改变逆变电路输出电压的大小,也可改变输出频率。
在采样控制理论中有一个重要的结论,即冲量相等而形状不同的窄脉冲加在具有惯性的环节上,其效果基本相同。
冲量既指窄脉冲的面积。
这里所说的效果基本相同。
是指该环节的输出响应波形基本相同。
如把各输出波形用傅里叶变换分析,则它们的低频段特性非常接近,仅在高频段略有差异。
根据上面理论我们就可以用不同宽度的矩形波来代替正弦波,通过对矩形波的控制来模拟输出不同频率的正弦波。
b)PCA是一个具有捕获功能的16定时器,高八位TH0,低八位TLO,CCON寄存器控制着定时器的计数与中断请求。
CR=1表示开始计数,CCON最低位加上CMOD的最低位可以控制产生中断。
中断的向量是interrupt 7,进行中断时,必须首先将sbitCCF0=CCON^0;PCA模块0中断标志,由硬件置位,必须由软件清0。
软件清0,再进行其它他操作。
对于PCA计数阵列的计数频率则由CMOD的低三位控制,可以用此来控制计数频率,如以FOSC或分频计数均可。
每个PCA阵列均有两个模式控制寄存器,CCAPM0或1,它控制着PCA进行何种操作,如捕获,上升沿捕获,高速输出,PWM输出,可以直接通过设置来设置PCA的需要完成的功能。
三、硬件电路说明本实验使用AT89C51单片机,利用PCA定时器实现脉冲宽度调制,单片机P1.0,P1.1端口分别接两个开关,控制LED灯闪烁频率,P3.0接示波器和LED灯,输出矩形。
STC12内部PWM使用方法解析STC12系列单片机是深圳市袋鼠电子股份有限公司出品的一款高性价比的51单片机系列产品。
STC12单片机内部集成了丰富的外设,包括多个定时器/计数器、串口通信接口、ADC(模数转换器)和PWM(脉冲宽度调制)输出等功能。
本篇文章将着重介绍STC12单片机的内部PWM模块的使用方法。
PWM是一种通过改变脉冲信号的占空比来控制电机、LED等器件的工作状态的技术。
在STC12单片机中,可以通过硬件PWM或软件PWM的方式来实现对外设的控制。
硬件PWM是由单片机内部的PWM模块自动产生的脉冲信号,不需要单片机的软件干预;而软件PWM是通过软件编程来实现对IO口的高低电平切换,从而模拟出脉冲信号。
下文将详细介绍STC12单片机的内部PWM模块的使用方法。
1. 定时器/计数器的选择:STC12单片机中有多个定时器/计数器模块可供选择,例如Timer0、Timer1、Timer2等。
这些定时器/计数器模块可用于产生PWM信号的时钟源。
一般情况下,Timer2是最常用的选择,因为它可以独立设置工作模式,而不会干扰其他外设的工作。
2.PWM的工作模式选择:STC12单片机的PWM模块提供了多种工作模式选择,如16位定时器模式、8位定时器模式、PCA脉冲宽度调制模式等。
在选择工作模式时,需要考虑到要控制的外设的需求,并根据外设的工作要求选择合适的PWM输出模式。
3.PWM的占空比设置:PWM的占空比是指PWM信号中高电平的时间占整个周期的比例。
在STC12单片机中,可以通过读写PWM模块相应的寄存器来设置占空比。
具体设置方法可参考STC12的相关资料或数据手册。
4.PWM输出管脚设置:在STC12单片机中,PWM信号可以通过多个IO口输出。
使用PWM输出功能时,需要将相应的IO口设置为PWM输出模式,并将PWM输出模块与IO口进行配置。
具体配置方法可参考STC12的开发工具或相关资料。
stc8 pca脉冲宽度STC8 PCA脉冲宽度PCA (Programmable Counter Array) 是STC8系列单片机中的一个重要特性,它用于生成精确的脉冲宽度调制(PWM)信号。
本文将详细介绍STC8 PCA脉冲宽度,从基础知识到具体应用,逐步回答您的疑问。
第一部分:什么是PCA?PCA是STC8系列单片机提供的一个功能强大的模块,能够产生PWM信号,使用它可以方便地控制外设设备。
PCA模块包含12位定时/计数器、比较器和比较器中断,可用于输出PWM信号、软件定时器等应用。
第二部分:PCA模块的工作原理PCA模块通过定时/计数器以固定频率进行计数,并在计数器的值达到某个阈值时产生中断。
比较器则用于比较定时/计数器的值和用户设定的比较值,当二者相等时触发中断或产生PWM输出。
通过设置不同的定时/计数器初值和比较值,可以产生不同频率和占空比的PWM信号。
第三部分:PCA模块的主要寄存器1. CCON寄存器:CCF0~CCF5分别表示PCA比较器0~5的中断标志位;2. CMOD寄存器:用于设置PCA时钟源、计数器溢出中断方式等;3. CL寄存器和CH寄存器:设置PCA定时/计数器的初值;4. CCAP0L寄存器和CCAP0H寄存器:设置PCA比较器0的比较值。
第四部分:生成PWM信号的步骤1. 设置PCA的时钟源:通过CMOD寄存器设置PCA的时钟源,可以选择内部系统时钟、时钟脉冲生成器或外部时钟输入。
2. 设置PCA的定时/计数器初值:将所需的PWM周期值加载到CL和CH寄存器中。
3. 设置PCA的比较值:将所需的占空比值加载到CCAP0L和CCAP0H 寄存器中。
4. 启动PCA模块:设置CMOD寄存器中的CF位实现PCA模块的启动,开始计数。
5. 判断中断标志位:通过CCON寄存器的CCF位判断是否发生PCA中断,即比较器的值与定时/计数器的值相等。
6. 清除中断标志位:在处理PCA中断后,需将相应的CCF位清零,以免再次触发中断。
PCA概述PCA就是一个定时器(计数器),和一般定时器原理相似:当PCA被使能则PCA由初值开始定周期累加,然后读取PCA的值。
我们通常的做法是比较PCA是否等于我们提前设定的定时标志寄存器的值,如果相等,则定时时间到。
PCA也是这样,不过PCA已经给我们准备好了定时标志寄存器,也已经做好了比较机制,不再需要我们在程序中添加比较语句。
PCA是一个16位定时器,它有5个定时标志寄存器(CCAPnH+CCAPnL,n=0,1,2,3,4),把PCA划分成5个定时模块,这5个模块分别有一个单片机引脚与之对应。
与标准的定时器/计数器相比,PCA对CPU 的干扰小,定时更精确,减少了软件设计。
二 PCA相关寄存器1.CMOD:PCA模式选择寄存器CIDL:0-单片机空闲模式PCA工作;1-单片机空闲模式PCA不工作WDTE:0-定时模块4禁用看门狗;1-定时模块4启用看门狗CPS1,CPS0:PCA定时频率选择位(具体请看DATASHEET)ECF:1-使CF为1时会产生中断2.CCON:PCA控制寄存器CF:PCA定时2BYTE溢出标志,当CF变高时,PCA会产生溢出中断,CF位必须软件清零,前提是ECF对CF使能CR:PCA启停位,0-停止PCA计数,1-启动PCA计数CCFn(n=0,1,2,3,4):当PCA某个模块检测到PCA定时器的值和自己的定时标志寄存器的值相等时,对应的CCFn会被硬件置位, CCFn必须软件清零,前提是对应的MAT对CCF使能3.CCAPMn:PCA比较模式选择寄存器(n=0,1,2,3,4)ECOM:0-关闭比较功能;1-打开比较功能CAPP:1-PCA的下降沿捕捉定时器的值CAPN:1-PCA的上升沿捕捉定时器的值(当CAPP和CAPN都为1时,上升沿和下降沿都捕捉)MAT:1-使能定时时间与定时标志寄存器相等时CCF由硬件置位的功能TOG:1-使能定时时间与定时标志寄存器相等时,该模块对应的管脚输出高电平的功能PWM:1-脉宽调制功能打开;0-脉宽调制功能关闭ECCF:1-使当CCF=1时可以产生中断4.CCAPnH, CCAPnL (n=0,1,2,3,4):PCA定时标志寄存器5.CH,CL:PCA定时寄存器6.CEXn (n=0,1,2,3,4):与各模块相关的单片机引脚三 PCA基本功能PCA基本功能有5种:捕捉功能、16位软件定时器功能、高速输出功能、脉冲宽度调制功能PWM和看门狗功能,其中看门狗功能只有模块4支持,具体说明如下:1.捕捉功能:选择方法:ECCF=1功能介绍:当给所用模块相应的管脚改变时,PCA会将当前定时器中的值捕捉到用户的定时标志寄存器中,捕捉后该模块的CCFn会被硬件置位,同时产生中断。