飞思卡尔单片机HCS timer和PWM 教程共46页文档
飞思卡尔单片机快速上手指南说明书
Freescale Semiconductor, Inc.Document Number: 用户指南 Rev. 0, 09/2014Confidentiality statement, as appropriate to document/part status.___________________________________________________________________飞思卡尔单片机快速上手指南作者:飞思卡尔半导体IMM FAE 团队飞思卡尔半导体是全球领先的单片机供应商,其单片机产品包含多种内核,有数百个系列。
为支持用户使用这些产品,飞思卡尔提供了丰富的网站资源、文档及软硬件工具,另外,我们还有众多的第三方合作伙伴及公共平台的支持。
对于不熟悉飞思卡尔产品和网站的初学者来说,了解和使用这些资源这无疑是一个令人望而生畏的浩瀚工程。
本指南的目的,就是给初学者提供一个指导,让他们不被这些海量信息淹没;用户根据本指导提供的操作步骤,能迅速找到所需的资源,了解如何使用相关的工具。
在本指南中,我们以飞思卡尔的新一代Kinetis 单片机K22系列为例,介绍了如何获取与之相关的资源,如何对其进行软硬件设计和开发。
实际上,这些方法也适用于其它的单片机系列。
当然,对于其它有较多不同之处的产品,我们也会继续推出相应的文档,供广大用户参考。
目录1 如何获取技术资料与支持 ..........................................................2 2 如何选择产品、申请样片及购买少量芯片和开发工具 ........... 93 飞思卡尔单片机的开发环境、开发工具和生态系统 ............. 224 如何阅读飞思卡尔的技术文档 ................................................ 45 5 飞思卡尔单片机硬件设计指南 ................................................ 55 6飞思卡尔单片机软件开发指南 (67)飞思卡尔单片机快速上手指南, Rev. 1, 09/20142Freescale Semiconductor, Inc.1 如何获取技术资料与支持1.1 概述当用户使用飞思卡尔单片机芯片时,如何获取芯片的数据手册(Datasheet )、参考设计(Reference Manual )和官方例程等资源呢?另外当用户遇到了技术问题该如何获得帮助和解答呢?这里以Kinetis 的K22系列芯片为例为大家介绍如何解决这些问题。
飞思卡尔应用笔记之PWM
作者:盛多铮单位:安徽师范大学电子信息工程系寒假的时候开始接触9S12XS128这款片子,并在寒假掌握了codewarrior开发环境的基本使用和SCI模块串口收发方面的编程。
新学期一开始由于一直在忙着另外一个采集方面的课题,所以飞思卡尔的学习进展不是很快,今天看了PWM模块和PIT模块的相关资料,并自己写了一些小小的程序,在示波器上看到了理想的波形,所以趁着今晚有空,将这方面的学习感悟总结一下,在自我总结的同时,也希望给你的学习带来一些帮助,所谓赠人玫瑰,手留余香呵呵。
废话不多说,进入正题PWM模块9S12XS128共有8个独立的可编程的PWM通道,可配置成8个8位或4个16位的PWM 通道,共有4个时钟源,可软件设置对齐方式和极性,这里所谓的极性就是说PWM一开始输出的是高电平还是低电平。
下面就我们常用的寄存器作简单介绍(因为别的寄存器我也没用到呵呵。
)1、PWM Enable Register(PWME)PWME[7:0]分别控制着对应的8个通道的使能,例如:PWME_PWME0=0:禁止通道0的PWM输出PWME_PWME7=1: 使能通道7的PWM输出2、PWM Polarity Register(PWMPOL)ZAPWMPOL寄存器是用来控制PWM一开始输出时的信号高低情况,假如PPOLX设为1,则与之相应的PWM通道在开始的时候输出为高电平,然后等到计数器的值与你设置的那个PWM信号的值(PWMDTYx)相等的时候就输出低电平。
PPOL的值为0的时候正好与这相反。
3、PWM Clock Select Register(PWM 时钟选择)PWMCLK寄存器是用来设置每个通道的参考时钟源的,每个通道都有2个时钟源,具体的为CLOCK A,CLOCK SA(0,1,4,5);CLOCK B,CLOCK SB(2,3,6,7),例如:PWMCLK_PCLK0=0;则通道0选择CLOCK A作为时钟源PWMCLK_PCLK6=1;则通道6选择CLOCK SB作为参考时钟源4、PWM Prescale Clock Select Regisrer(PWMPRCLK)PWMPRCLK的第3位和第7位没有定义,低三位用来设置CLOCK A的分频,4-6位则设置CLOCK B的分频,以CLOCK A为例,具体值的计算如下表:假如说,外部晶振为12M,SYNR为1,REFDV的值为0,则总线时钟为24M,然后你将PWMPRCLK设为0x03,那么你这个CLOCK A的频率就为3M5、PWM Center Align Enable Register(PWMCAE)PWMCAE寄存器用来设置每个通道的对齐方式,CAEx为0时,设置相应的通道为左对齐,CAEx为1时,设置相应的通道为中心对齐,例如:PWMCAE_PCAE=0,则通道0设置为左对齐,那么左对齐和中心对齐有什么不同呢,别急,这个等讲到PWMDTYx和PWMPERx这两个寄存器后要好解释一点。
pwm(飞思卡尔单片机)
#include "derivative.h" /* derivative-specific definitions */
/*************************************************************/
REFDV = 0x01; //时钟分频寄存器
//锁相环产生的时钟频率f=2*foscclk*(SYNR+1)/(REFDV+1)
//对于S12DG128 16MHz外部晶体振荡器,总线时钟为24MHz
//片内系统时钟为48MHz
while((CRGFLG & 0x08) !=0x08); /*等待锁相环频率锁定*/
PWMPER01 = 5000; //通道01的周期为4Hz
PWMPER23 = 5000; //通道23的周期为1Hz
PWMDTY01 = 3500; //通道01的占空比为70%
PWMDTY23 = 1500; //通道23的占空比为70%
PWME_PWME1 = 1; //使能通道01
PWME_PWME3 = 1; //使能通道23
}
void main(void) {
DisableInterrupts;
MCUInit();
init_pwm();
DDRB=1;
PORTB=1;
EnableInterrupts;
foபைடு நூலகம்(;;)
{
}
}
void init_pwm(void)
{
PWMCTL_CON01= 1; //联结通道0,1为16位的PWM
飞思卡尔 PWM机理【转】
Width Modulation)原理:PulseWidth一、PWM(脉冲宽度调制Pulse脉冲宽度调制波通常由一列占空比不同的矩形脉冲构成,其占空比与信号的瞬时采样值成比例。
图1所示为脉冲宽度调制系统的原理框图和波形图。
该系统有一个比较器和一个周期为Ts的锯齿波发生器组成。
语音信号如果大于锯齿波信号,比较器输出正常数A,否则输出0。
因此,从图1中可以看出,比较器输出一列下降沿调制的脉冲宽度调制波。
通过图1b的分析可以看出,生成的矩形脉冲的宽度取决于脉冲下降沿时刻t k时的语音信号幅度值。
因而,采样值之间的时间间隔是非均匀的。
在系统的输入端插入一个采样保持电路可以得到均匀的采样信号,但是对于实际中tk-kTs<<Ts的情况,均匀采样和非均匀采样差异非常小。
如果假定采样为均匀采样,第k个矩形脉冲可以表示为:(1)其中,x{t}是离散化的语音信号;Ts是采样周期;是未调制宽度;m是调制指数。
然而,如果对矩形脉冲作如下近似:脉冲幅度为A,中心在t=k Ts处,在相邻脉冲间变化缓慢,则脉冲宽度调制波x p(t)可以表示为:(2)其中,。
无需作频谱分析,由式(2)可以看出脉冲宽度信号由语音信号x(t)加上一个直流成分以及相位调制波构成。
当时,相位调制部分引起的信号交迭可以忽略,因此,脉冲宽度调制波可以直接通过低通滤波器进行解调。
二、数字脉冲宽度调制器的实现:实现数字脉冲宽度调制器的基本思想参看图2。
图中,在时钟脉冲的作用下,循环计数器的5位输出逐次增大。
5位数字调制信号用一个寄存器来控制,不断于循环计数器的输出进行比较,当调制信号大于循环计数器的输出时,比较器输出高电平,否则输出低电平。
循环计数器循环一个周期后,向寄存器发出一个使能信号EN,寄存器送入下一组数据。
在每一个计数器计数周期,由于输入的调制信号的大小不同,比较器输出端输出的高电平个数不一样,因而产生出占空比不同的脉冲宽度调制波。
图3为了使矩形脉冲的中心近似在t=kTs处,计数器所产生的数字码不是由小到大或由大到小顺序变化,而是将数据分成偶数序列和奇数序列,在一个计数周期,偶数序列由小变大,直到最大值,然后变为对奇数序列计数,变化为由大到小。
飞思卡尔单片机教学
3
第三页,共44页。
第3章 MC9S12单片机的内核及片上资源
时钟和锁相环及相关引脚
EXTAL、XTAL:接外部振荡器 RESET:接外部复位,低电平有效 XFC:接锁相环滤波电容 VDDPLL、VSSPLL:锁相环供电引脚。使能电压调整模块 ( VREGEN 上拉)时,该引脚直接去耦电容。
BKGD(MODC)、MODB、MODA:模式选择 NOACC/XCLKS:当前外部总线操作无效
5
第五页,共44页。
第3章 MC9S12单片机的内核及片上资源
模式选择
6
第六页,共44页。
第3章 MC9S12单片机的内核及片上资源
地址数据总线
PORTA和PORTB作为扩展模式下的 数据和地址复用总线,寻址达到 64K范围 窄模式下:PORTA为8位数据总线 宽模式下:PORTA、PORTB为16位数 据总线 PTK为扩展存储器超过64K时用,不扩 展时作为普通I/O口。
30
第3章 MC9S12单片机的内核及片上资源
(2)时钟合成寄存器(SYNR)-低6位有效,有效值0~63。 (3)时钟分频寄存器(REFDV)-低4位有效,有效值0~15。
由锁相环来产生时钟频率的公式:
例如:选用16MHz的外部晶振,若将SYNR设为
2,REFDV设为1,通过公式计算可得 PLLCLK=48MHz。
第三十一页,共44页。
31
第3章 MC9S12单片机的内核及片上资源 (4)时钟产生模块的标志寄存器CRGFLG
实时中断标志位
1=RTI发生了超时中断,向
该位写1清除该中断标志位。
锁相环频率锁定标志
单片机PWM调光程序
单片机PWM调光程序一、概述PWM(Pulse Width Modulation,脉宽调制)是一种常用的调光技术,通过控制信号的脉冲宽度来调节输出电平的平均值,从而实现对光源亮度的调节。
本文将介绍如何编写单片机PWM调光程序,并提供一个基于XX单片机的示例代码。
二、硬件准备1. 单片机:XX单片机(型号)2. 光源:LED灯(型号)3. 光敏电阻:用于实时检测环境光强度的元件4. 电路连接:将单片机的PWM输出引脚连接到LED灯的控制引脚,将光敏电阻连接到单片机的模拟输入引脚三、软件设计1. 引入头文件:根据单片机型号,引入相应的头文件,例如"xx.h"。
2. 定义宏:定义LED灯的控制引脚和光敏电阻的模拟输入引脚。
3. 初始化:设置单片机的引脚模式和PWM参数,例如设置PWM频率、占空比等。
4. 光敏检测:通过模拟输入引脚读取光敏电阻的电压值,将其转换为环境光强度的数值。
5. PWM调光:根据光敏检测到的环境光强度数值,计算对应的PWM占空比,并将其输出到LED灯的控制引脚。
四、示例代码```c#include <xx.h> // 引入相应的头文件#define LED_PIN 1 // 定义LED灯的控制引脚#define LDR_PIN 2 // 定义光敏电阻的模拟输入引脚void init_pwm() {// 设置引脚模式为PWM输出pinMode(LED_PIN, PWM_OUTPUT);// 设置PWM参数pwmSetMode(PWM_MODE_MS);pwmSetClock(100); // 设置PWM频率为100HzpwmSetRange(1024); // 设置PWM占空比范围为0-1024 }int read_ldr() {// 读取光敏电阻的电压值int ldr_value = analogRead(LDR_PIN);// 根据电压值转换为环境光强度数值int light_intensity = map(ldr_value, 0, 1023, 0, 100);return light_intensity;}void adjust_brightness(int light_intensity) {// 根据环境光强度计算PWM占空比int pwm_duty_cycle = map(light_intensity, 0, 100, 0, 1023);// 输出PWM占空比到LED灯的控制引脚pwmWrite(LED_PIN, pwm_duty_cycle);}int main() {init_pwm(); // 初始化PWMwhile (1) {int light_intensity = read_ldr(); // 光敏检测adjust_brightness(light_intensity); // PWM调光}return 0;}```五、使用方法1. 将示例代码中的XX单片机型号替换为实际使用的单片机型号。
飞思卡尔单片机的程序
#include "derivative.h"//-----------------------------------------------------static void SCI_Init(void){SCI0CR2=0x2c; //enable Receive Full Interrupt,RX enable,Tx enableSCI0BDH=0x00; //busclk 8MHz,19200bps,SCI0BDL=0x1aSCI0BDL=0x68; //SCI0BDL=busclk/(16*SCI0BDL)//busclk 8MHz, 9600bps,SCI0BDL=0x34//busclk 8MHz, 9600bps,SCI0BDL=0x68//busclk 24MHz, 9600bps,SCI0BDL=0x9C} //busclk 32MHz, 9600bps,SCI0BDL=0xD0//busclk 40MHz, 9600bps,SCI0BD =0x104//-----------------------------------------------------static void Port_Init(void){DDRA = 0xff; //LCD1100,PA0--4,PA67 D1D2PORTA= 0x00;DDRB = 0xff; //LED PTB0--7,PORTB= 0xff; //LEDs onDDRE = 0xFF; //MOTOR CONTROLPORTE= 0x00; //PDDRH = 0x00; // PORTH inputPTIH = 0X00; // KEY,PH0--5PERH = 0xff; // PORTH pull upPPSH = 0x00; // Port H Polarity Select Register-falling edgePIEH = 0x02; // PORTH interrut disable but 1,DDRJ = 0X01; // PJ0判断行同步脉冲到达//PPSJ = 0x01; // Port J Polarity Select Register-rising EDGEPPSJ = 0x00; // Port J Polarity Select Register-falling EDGEPIEJ = 0X00; // VIDEO SYNC INTERRUPT DISABLED,BUT NOT IN MAIN() PERJ = 0xff;DDRP = 0xff;PERP = 0xff;PTP_PTP0 = 0;}//-----------------------------------------------------static void PWM_Init(void){//SB,B for ch2367//SA,A for ch0145PWMPRCLK = 0X55; //clockA,CLK B 32分频:500khzPWMSCLA = 0x02; //对clock SA 进行2*PWMSCLA=4分频;pwm clock=clockA/4=125KHz;PWMSCLB = 0X02; //clk SB=clk B/(2*pwmsclb)=125KHZ//pwm1PWMCNT1 = 0;PWMCAE_CAE1=0;PWMPOL_PPOL1=0;PWMPER1 =125;PWMDTY1 =100;PWMCLK_PCLK1 = 1;PWME_PWME1 = 0;}void AD_Init(void){A TD0CTL1=0x00; //7:1-外部触发,65:00-8位精度,4:放电,3210:chA TD0CTL2=0x40; //禁止外部触发, 中断禁止A TD0CTL3=0xa0; //右对齐无符号,每次转换4个序列, No FIFO, Freeze模式下继续转A TD0CTL4=0x01; //765:采样时间为4个AD时钟周期,ATDClock=[BusClock*0.5]/[PRS+1]A TD0CTL5=0x30; //6:0特殊通道禁止,5:1连续转换,4:1多通道轮流采样A TD0DIEN=0x00; //禁止数字输入}//-----------------------------------------------------//IOC7/PT7用于计算CS3144产生的脉冲数static void IOC_Init(void){TCTL3=0xc0;//c-输入捕捉7任何沿有效,TCTL4=0xc0;//40表示ICx禁止, 1表示上升沿, 2表示下降沿, 3表示任何沿TIE =0x00;//每一位对应相应通道中断允许,0表示禁止中断TIOS =0x00;//每一位对应通道的: 0输入捕捉,1输出比较TCTL3_EDG7x=1;//c-输入捕捉7任何沿有效,}//产生40ms的定式中断,读取IOC7的计数值static void Timer_Init(void){//TSCR1=0X80;//TIMER INT ENABLED//TSCR1=0x90;//计数器使能TEN|快速清零TFFCATSCR1=0X00; //禁止TIM//TSCR2=0X80;//DIV 1->2.5ms,enable time overflow interrrupt//TSCR2=0X82;//DIV 4->10ms//TSCR2=0X83;//DIV 8->20ms//TSCR2=0X84;//DIV 16->40msTSCR2=0X85;//DIV 32->80ms//TSCR2=0X86;//DIV 64->160ms//TSCR2=0X87;//DIV 128->320ms,enable time overflow interrruptTCNT =0; //PACTL=0X50; //PT7 PIN,PACN32 16BIT,FALLing edge,NOT INTERRUPT //PBCTL=0X40;//PBCN10 16BIT,INT DISABLED//ICPAR=0; //8BIT DISABLED}//-----------------------------------------------------// setup of the RTI interrupt frequencystatic void RTI_Init(void){//RTICTL=0x10; //2^10x40ms=4.96s//RTICTL=0X74; //SET PRESCALER,div rate=(m+1)x2^(n+9),(m=1-7,n=0-15)//tick=16Mhz/((4+1)x2^(7+9))=48.83,(/sec)//16000000/64k=244.140625 ,与晶振频率相关,与分频无关RTICTL=0x77; //8x2^16 =>32,75ms,30.5175Hz//RTICTL=0x7f; //16x2^16 =>,65.536ms,15.26Hz//RTICTL=0x1F; //16x2^10--1ms//CRGINT=0X80; //enable RTI InterruptCRGINT=0X00; //disable RTI Interrupt}static void Time_Start(void){RTI_Init();CRGINT=0X80; //enable RTI Interrupt}//-----------------------------------------------------// PLL初始化子程序BUS Clock=16Mvoid setbusclock(void){CLKSEL=0X00; // disengage PLL to systemPLLCTL_PLLON=1; // turn on PLLSYNR=0x00 | 0x01; // VCOFRQ[7:6];SYNDIV[5:0]// fVCO= 2*fOSC*(SYNDIV + 1)/(REFDIV + 1)// fPLL= fVCO/(2 × POSTDIV)// fBUS= fPLL/2// VCOCLK Frequency Ranges VCOFRQ[7:6]// 32MHz <= fVCO <= 48MHz 00// 48MHz < fVCO <= 80MHz 01// Reserved 10// 80MHz < fVCO <= 120MHz 11REFDV=0x80 | 0x01; // REFFRQ[7:6];REFDIV[5:0]// fREF=fOSC/(REFDIV + 1)// REFCLK Frequency Ranges REFFRQ[7:6]// 1MHz <= fREF <= 2MHz 00// 2MHz < fREF <= 6MHz 01// 6MHz < fREF <= 12MHz 10// fREF > 12MHz 11// pllclock=2*osc*(1+SYNR)/(1+REFDV)=32MHz;POSTDIV=0x00; // 4:0, fPLL= fVCO/(2xPOSTDIV)// If POSTDIV = $00 then fPLL is identical to fVCO (divide by one)._asm(nop); // BUS CLOCK=16M_asm(nop);while(!(CRGFLG_LOCK==1)); //when pll is steady ,then use it;CLKSEL_PLLSEL =1; //engage PLL to system;}//-----------------------------------------------------#pragma CODE_SEG DEFAULTvoid Init_Dev(void){setbusclock();Port_Init();SCI_Init();PWM_Init();AD_Init();Timer_Init();Time_Start();IOC_Init();}//-----------------------------------------------------。
FreeScale_HCS12系列单片机教程(dg128)
HCS12微控制器系列教程---第一讲:PWM 模块介绍该教程以MC9S12DG128单片机为核心进行讲解,全面阐释该16位单片机资源。
本文为第一讲,开始介绍S12 MCU的PWM模块。
PWM 调制波有8 个输出通道,每一个输出通道都可以独立的进行输出。
每一个输出通道都有一,一个周期控制寄存器和两个可供选择的时钟源。
每一个PWM 输出个精确的计数器(计算脉冲的个数)通道都能调制出占空比从0—100% 变化的波形。
PWM 的主要特点有:1、它有8 个独立的输出通道,并且通过编程可控制其输出波形的周期。
2、每一个输出通道都有一个精确的计数器。
3、每一个通道的PWM 输出使能都可以由编程来控制。
4、PWM输出波形的翻转控制可以通过编程来实现。
5、周期和脉宽可以被双缓冲。
当通道关闭或PWM计数器为0时,改变周期和脉宽才起作用。
6、8 字节或16 字节的通道协议。
,他们提供了一个宽范围的时钟频率。
7、有4 个时钟源可供选择(A、SA、B、SB)8、通过编程可以实现希望的时钟周期。
9、具有遇到紧急情况关闭程序的功能。
10、每一个通道都可以通过编程实现左对齐输出还是居中对齐输出。
HCS12微控制器系列教程---第二讲:PWM 寄存器简介1、PWM启动寄存器PWMEPWME 寄存器每一位如图1所示:复位默认值:0000 0000B图1 PWME 寄存器每一个PWM 的输出通道都有一个使能位PWMEx 。
它相当于一个开关,用来启动和关闭相应通道的PWM 波形输出。
当任意的PWMEx 位置1,则相关的PWM输出通道就立刻可用。
用法:PWME7=1 --- 通道7 可对外输出波形PWME7=0 --- 通道7 不能对外输出波形注意:在通道使能后所输出的第一个波形可能是不规则的。
当输出通道工作在串联模式时(PWMCTL寄存器中的CONxx置1),那么)使能相应的16位PWM 输出通道是由PWMEx的高位控制的,例如:设置PWMCTL_CON01 = 1,通道0、1级联,形成一个16位PWM 通道,由通道1 的使能位控制PWM 的输出。
飞思卡尔8位单片机-第7章 定时器和比较器模块
二、TPM中的寄存器
(三)TPM模寄存器(TPMMODH:TPMMODL)
TPMMOD高位 TPMMODH
TPMMOD低位 TPMMODL
两个可读/写8位寄存器,定义计数器的最大值 加法计数器(CPWMS=0),当计数器计数到与模寄存 器数值相等时,TPMCNT翻转至0x0000 加/减计数器(CPWMS = 1),当计数器计数到与模寄存器 数值相等时,计数器开始递减。
表7-5 模式、沿和电平选择
CPWMS MSnB: MSnA ELSnB: ELSnA
模式
功能
x 0
xx 00
00 01 10 11 00 01 10 11 10 x1
通道未使用外部管脚,可能是管脚作为TPM的外部时钟 输入或者是将管脚作为通用I/O使用。 输入捕捉 仅上升沿捕捉 仅下降沿捕捉 上升沿或下降沿都捕捉 仅软件比较,无管脚输出 比较匹配时,外部管脚翻转 比较匹配时,外部管脚清0 比较匹配时,外部管脚置1 脉宽有效期间高电平(比较匹配时, 外部管脚清0) 脉宽有效期间低电平(比较匹配时, 外部管脚置1) 脉宽有效期间高电平(比较匹配时, 外部管脚清0) 脉宽有效期间低电平(比较匹配时, 外部管脚置1)
触发:外部引脚发生有效电平跳变
响应: CHnF=1 , 主计数器TPMCNT值→通道辅助寄存器TPMCnV
三、TPM模块的功能模式
(二)输出比较
功能:从外部引脚输出可编程脉冲
模式设定方式:
CPWMS 0 MSnB: MSnA 01 ELSnB: ELSnA 00 01 10 11 模式 输出比较 功能描述 仅软件比较,无管脚输出 比较匹配时,外部管脚翻转 比较匹配时,外部管脚清0 比较匹配时,外部管脚置1
飞思卡尔PWM程序(含详细指令说明)
//在任何时间都是可读、可写的,复位时全置0。应当注意的是,如果当一个 PWM
//输出波形正在产生时,时钟改变,这时就会产生一个平头的或线形脉冲。
//用法: PCLK1=1; 1 通道的时钟源设为 SA。 PCLK1=0; 1 通道的时钟源设为 A。
//如果通道不可用,那么对周期寄存器进行写操作,将会直接导致周期寄存器同缓冲器一起
//闭锁。
//周期的计算方法:(因为左对齐和居中对齐方式输出时的计数器工作方式不一样)
//1) 当 CAEx=0时,即进行左线性输出时:
// `PWMx 周期=通道时钟周期*PWMPERx
PWMPOL_PPOL3=1; // Duty=High Time 极性设置
//3通道对外输出为先高后低(PWMPOL_PPOL3=0 则3通道对外输出为先低后高)
PWMCAE_CAE3=0; // Left-aligned 对齐方式设置
//------------------------------------------------------------------------------------------------------------------//
//功能说明:MC9S12XS128--PWM例程
//使用说明:实现通道3(PTP3)输出频率为1KHz,占空比为50%的方波,用示波器观察
//决定了相关 PWM 通道的周期。 每一个通道的周期寄存器都是双缓冲的,因此如果当通
//道使能后,改变他们的值,将不会发生任何作用,除非当下列情况之一发生:
//*有效的周期结束。
飞思卡尔单片机教程
注 : A/D模块的时钟频率要在500KHz和2MHz之间, 所以在选择分频因子时一定要注意。
采样时间选择
SMP [1 :0]
采样时间
00
2个 A/D时钟周期
01
4个A/D时钟周期
ATDclock= ( (BusClock) / (PRS+1) ) /2
10
8个A/D时钟周期
11
16个A/D时钟周期
设CCBCA = 000,转换序列从通道
0开始;ATD0DR0,
ATD0DR1,ATD0DR2存放转换结果
设CCBCA = 0 10,转换序列从通道 2开始。 仍然是ATD0DR0,
ATD0DR1,ATD0DR2存放转换结果
S8C 、S4C 、S2C 、S1C:定义转换队列的长度 。默认长度为4。 FIFO: 结果寄存器先进先出模式 。1=FIFO模式 ,转换结果是连续 存放的;0=非FIFO模式 ,转换结果放在对应的寄存器中。 FRZ1、FRZ0:背景调试冻结模式允许 。这两个控制位就决定了,
{ while (ATD1STAT0_SCF ==0) ;
ad_value [0] = ATD1DR0; ad_value [4] = ATD1DR4;//使用 PORTB= (byte) ad_value [4] ;
}}
void ATDInit(void)
{ATD1CTL2=0xC0;//AD模块上电,快速清零,无等待模式,禁止外部触发, 中断禁止 // ADPU AFFC AWAI ETRIGLE --- ETRIGP ETRIGE ASCIE ASCIF
PRS=3
ATD1CTL5=0xA4; //右对齐无符号 ,单通道采样 ,通道0
飞思卡尔定时器模块
CLK
.
TCNT
Address Offset $0004, 05
PIN
B0.......……...B7 B8……..........B15
脉冲累加器
TEN DATA BUS
TSCR1 -定时器控制寄存器
R = Reserved
TM
TEN TSWAI TSFRZ TFFCA R R R R $0006
Semiconductor, Inc. All other product or service names are the property of their respective owners. © Freescale Semiconductor, Inc. 2005.
定时器结构
模块时钟
M Clock
Semiconductor, Inc. All other product or service names are the property of their respective owners. © Freescale Semiconductor, Inc. 2005.
定时器编程步骤
用途: 产生周期中断
Enhanced Capture Timer Module 增强型捕捉定时器模块
TM
Freescale Semiconductor Confidential and Proprietary Information. Freescale™ and the Freescale logo are trademarks of Freescale Semiconductor, Inc. All other product or service names are the property of their respective owners. © Freescale Semiconductor, Inc. 2005.
飞思卡尔定时中断程序3
2D64定时器中断和频率捕捉中断冲突问题一、首先大致功能:1:四路频率捕捉中断,要求可同时输入四路,也可任意输入一路、两路或者三路(10~2.5KHz)。
2、将捕捉到的频率通过四路PWM依次输出,要求实时、稳定、输入多少输出就为多少(误差:千分之二)。
3:定时器中断,1毫秒中断一次。
利用定时器屏蔽10Hz(100ms)以下的频率或者无频率输入时,置为0,屏蔽输出。
二、调试过程1、开始使用定时器中断和频率捕捉中断,频率捕捉中断开通方法:初始化四路全部开通,进入第一路捕捉中断,开通第二路捕捉中断,关闭第一路捕捉中断进入第二路捕捉中断,开通第三路捕捉中断,关闭第二路捕捉中断进入第三路捕捉中断,开通第四路捕捉中断,关闭第三路捕捉中断进入第四路捕捉中断,开通第一路捕捉中断,关闭第二路捕捉中断形成一个环状,只有当频率全部有输入时才能采集正常,有任意一路没有输入时都将停止中断的执行。
存在问题,当四路频率全部输入时,捕捉正常,但当只有一路或者两路或者三路输入时,能进入中断的那几路也只能响应一次中断。
程序如下:#pragma CODE_SEG __NEAR_SEG NON_BANKEDinterrupt void MDC_ISR() //定时器1ms中断一次{CpuCounter++; //工作指示灯计数器,500ms翻转一次if(ptflag0==1) //10Hz以下或者无输入时计数,进入捕捉中断标志和计数清零,中断结束时打开标志{ptcount0++;}if(ptflag1==1){ptcount1++;}if(ptflag2==1){ptcount2++;}if(ptflag3==1){ptcount3++;}if(ptcount0>100) //10Hz以下或者无输入时不允许输出 {ptcount0=0; //计数清零flagECT0=0; //标志清零fin1=0; //频率置为0PTH_PTH7=0; //指示灯熄灭PWME=PWME&0xfc; //不允许输出}if(ptcount1>100){ptcount1=0;flagECT1=0;fin2=0;PTH_PTH6=0;PWME=PWME&0xf3;}if(ptcount2>100){ptcount2=0;flagECT2=0;fin3=0;PTH_PTH5=0;PWME=PWME&0xcf;}if(ptcount3>100){ptcount3=0;flagECT3=0;fin4=0;PTH_PTH4=0;PWME=PWME&0x3f;}if(CpuCounter>=500) //处理器工作指示灯{cpuflag=1;CpuCounter=0;}MCFLG_MCZF=1;}interrupt void PT3_isr(){DisableInterrupts; //总中断关闭ptflag3=0; //清除无输入或者10Hz以下频率标志ptcount3=0; //清除无输入或者10Hz以下频率计数器TIE_C0I = 1; //开放ECT0局部中断TFLG1_C3F=1; //中断标志寄存器对C3F清零//newcount3=TC3; //读一次TCxif(TC3>TC3H){count3=TC3-TC3H;}else{count3=65535-TC3H+TC3;}if((count3>148)&&(count3<37450)) //10~2.5KHz有效,其余无效 {flagECT3=1; //输出标志置一PWME=PWME|0xc0; //允许输出}else //无效不允许输出{flagECT3=0; //输出标志清零fin4=0;PTH_PTH4=0;PWME=PWME&0x3f; //不允许输出}ptflag3=1; //打开无输入或者10Hz以下频率标志ptcount3=0; //清除无输入或者10Hz以下频率计数器 EnableInterrupts; //总中断开启TIE_C3I = 0; //关闭ECT3局部中断}interrupt void PT2_isr(){DisableInterrupts;ptflag2=0;ptcount2=0;TIE_C3I = 1; //开放ECT3局部中断TFLG1_C2F=1; //中断标志寄存器对C2F清零//newcount2=TC2;if(TC2>TC2H){count2=TC2-TC2H;}else{count2=65535-TC2H+TC2;}if((count2>148)&&(count2<37450)) //570 ->7hz{flagECT2=1;PWME=PWME|0x30;}else{flagECT2=0;fin3=0;PTH_PTH5=0;PWME=PWME&0xcf;}ptflag2=1;ptcount2=0;EnableInterrupts;TIE_C2I = 0; //关闭ECT2局部中断}interrupt void PT1_isr(){DisableInterrupts;ptflag1=0;ptcount1=0;TIE_C2I = 1; //开放ECT2局部中断TFLG1_C1F=1; //中断标志寄存器对C1F清零//newcount1=TC1;if(TC1>TC1H){count1=TC1-TC1H;}else{count1=65535-TC1H+TC1;}if((count1>148)&&(count1<37450)) //570 ->7hz {flagECT1=1;PWME=PWME|0x0c;}else{flagECT1=0;fin2=0;PTH_PTH6=0;PWME=PWME&0xf3;}ptflag1=1;ptcount1=0;EnableInterrupts;TIE_C1I = 0; //关闭ECT1局部中断}interrupt void PT0_isr(){DisableInterrupts;ptflag0=0;ptcount0=0;TIE_C1I = 1; //开放ECT1局部中断TFLG1_C0F=1; //中断标志寄存器对C0F清零//newcount0=TC0;if(TC0>TC0H){count0=TC0-TC0H;}else{count0=65535-TC0H+TC0;//溢出}if((count0>148)&&(count0<37450)) //570 ->7hz {flagECT0=1;PWME=PWME|0x03;}else{flagECT0=0;fin1=0;PTH_PTH7=0;PWME=PWME&0xfc;}ptflag0=1; //ptcount0=0;EnableInterrupts;TIE_C0I = 0; //关闭ECT0局部中断}#pragma CODE_SEG DEFAULTvoid main(void){InitPort();InitECT();InitPWM();InitMDC();EnableInterrupts;for(;;){if(cpuflag==1){PORTK_BIT1=~PORTK_BIT1;cpuflag=0;}siout(); //PWM输出show(); //显示函数}}//void InitMDC(void){MCCTL=0xEF;MCCNT=750; //定时1ms=750*16/(24/2) }//初始化ECTvoid InitECT(){TIOS=0; //0:设置为输入捕捉 1:设置为输出比较TFLG1=0xff; //定时器中断寄存器1 ,写1清零。
飞思卡尔单片机入门
KV31 Cortex M4
VOC BLDC & PMSM Motors with High Dynamic Control
100 MHz
KV30 – Cortex M4
75 MHz
KV1x – CM0+
VOC BLDC & Low End PMSM motors with Low Dynamic Control 64KB 128KB 256KB 512KB
Deep Dive on New Kinetis KV1x MCU for Motor Control
FTF-IND-F0473
Eric Wu | Product Marketing, Microcontrollers William Jiang | Application, Microcontrollers
M A Y. 2 0 1 4
TM
External Use
Agenda
•
Kinetis V Series MCU Overview • Deep Dive on KV1x • Tower Board and Demos
TM
External Use
1
Kinetis V Series MCU Overview
KV3x Family
Mid range PMSM, UPS power control
+ Multi Channel Timers + Floating Point Unit
2014
KV1x Family
BLDC, entry level PMSM
+ Motor Control Software
Feature Integration
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<n时,让单片相应的I/O口输出低电平,此时占空比就为%n。
2、程序1,使单片机的I/O口输出固定频率的PWM波下面按上面的思路给出一个具体程序:/*******************************************************************/ /* 程序名:单片机输出固定频率的PWM波*//* 晶振:11.00592 MHz CPU型号:STC89C52 *//* 功能:P2^0口输出周期为1ms(1000HZ),占空比为%80的PWM波*//*****************************************************************/#include<reg52.h>#define uint unsigned int#define uchar unsigned charsbit PWM1=P2^0;//接IN1 控制正转sbit PWM2=P2^1;//接IN2 控制反转uchar time;void main(){TMOD=0x01;//定时器0工作方式1TH0=0xff;//(65536-10)/256;//赋初值定时TL0=0xf7;//(65536-10)%256;//0.01msEA=1;//开总中断ET0=1;//开定时器0中断TR0=1;//启动定时器0while(1){}}void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=500;y>0;y--);}void tim0() interrupt 1{TR0=0;//赋初值时,关闭定时器TH0=0xff;//(65536-10)/256;//赋初值定时TL0=0xf7;//(65536-10)%256;//0.01msTR0=1;//打开定时器time++;if(time>=100) time=0;//1khzif(time<=20) PWM1=0;//点空比%80else PWM1=1;PWM2=0;}程序说明:1、关于频率的确定:对于11.0592M晶振, PWM输出频率为1KHZ,此时设定时器0.01ms 中断一次,时中断次数100次即为1KHZ( 0.01ms*100=1ms,即为1000HZ)此时,定时器计数器赋初值为TH0=FF,TL0=F7。
飞思卡尔PWM模块
飞思卡尔脉冲宽度调制模块——PWM模块目录1.简介 (1)2.特征 (1)3.框图 (1)4.功能描述 (2)4.1 预置分频器 (2)4.2 PWM发生器 (2)4.2.1 对齐 (2)4.2.2 周期 (3)4.2.3 脉宽占空比 (4)4.3 独立或互补信道操作 (4)4.4 死区发生器 (6)4.4.1 上、下管死区调整 (8)4.4.2 人工死区调整 (10)4.5 自动死区调整 (12)4.6 不对称PWM输出 (13)4.6 不对称PWM输出 (14)5.软件输出控制 (14)6.PWM发生器的装入 (15)6.1 装入使能 (15)6.2 装入频率 (15)6.3 重装标志 (17)6.4 同步输出 (19)6.5 初始化 (19)7.故障保护 (20)7.1 初始化 (20)7.2 自动故障清除 (21)7.3 手工故障清除 (21)8.操作模式 (22)9.引脚描述 (22)9.1 PWM0~PWM5引脚 (22)9.2 FAULT0~FAULT3引脚 (22)9.3 IS0~IS2引脚 (22)10.寄存器定义 (22)10.1 PWM控制寄存器(PMCTL) (24)10.1.1 装入频率(LDFQ)位15-12 (24)10.1.2 半周期重装(HALF)位11 (24)10.1.3 电流极性2(IPOL2)位10 (24)10.1.4 电流极性1(IPOL1)位9 (25)10.1.5 电流极性0(IPOL0)位8 (25)10.1.6 Prescaler(PRSC)位7-6 (25)10.1.7 PWM重装中断允许(PWMRIE)位5 (25)10.1.8 PWM重装标志(PWMF)位4 (25)10.1.9 电流状态(ISENS)位3-2 (26)10.1.10 允许装入(LDOK)位1 (26)10.1.11 PWM使能(PWMEN)位0 (26)10.2 PWM故障控制寄存器(PMFCTL) (26)10.2.1 保留位位15-8 (26)10.2.2 FAULT n引脚中断使能(FIE n)位7,5,3,1 (26)10.2.3 FAULT n引脚清除模式(FMODE n)位6,4,2,0 (27)10.3 PWM故障状态和确认寄存器(PMFSA) (27)10.3.1 FAULT n(FPIN n)位15,13,11,9 (27)10.3.2 FAULT n引脚标志(FFLAG n)位14,12,10,8 (27)10.3.3 保留位位7 (27)10.3.4 FAULT n引脚确认(FTACK n)位6,4,2,0 (27)10.3.5 死区n(DT n)位5-0 (27)10.4 PWM输出控制寄存器(PMOUT) (28)10.4.1 输出端衰减器使能(PAD_EN)位15 (28)10.4.2 保留位14 (28)10.4.3 输出控制使能(OUTCTRL5-0)位13-8 (28)10.4.4 保留位7-6 (28)10.4.5 输出控制(OUT5-0)位5-0 (28)10.5 PWM计数寄存器(PMCNT) (29)10.5.1 保留位15 (29)10.5.2 计数器(CNT)位14-0 (29)10.6 PWM计数器模数寄存器(PWMCM) (29)10.6.1 保留位15 (29)10.6.2 计数器模数(CM)位14-0 (29)10.7 PWM值寄存器(PWMV AL0-5) (30)10.7.1 值(V AL)位15-0 (30)10.8 PWM死区寄存器(PMDEADTM) (30)10.8.1 保留位15-12 (30)10.8.2 死区位11-0 (30)10.9 PWM禁止映射寄存器(PMDISMAP1-2) (31)10.10 PWM设置寄存器(PMCFG) (31)10.10.1 保留位15 (31)10.10.2 调试允许(DBG_EN)位14 (31)10.10.3 等待允许(WAIT_EN)位13 (31)10.10.4 边沿对齐或中心对齐PWM(EDG)位12 (32)10.10.5 保留位11 (32)10.10.6 上边PWM极性(TOPNEG)位10-8 (32)10.10.7 下边PWM极性(BOTNEG)位6-4 (32)10.10.8 独立或互补对操作(INDEP)位3-1 (32)10.10.9 写保护(WP)位0 (32)10.11 PWM通道控制寄存器(PMCCR) (33)10.11.1 硬件加速使能(ENHA)位15 (33)10.11.2 56F80x 兼容性(nBX)位14 (33)10.11.3 Mask(MSK5-0)位13-8 (33)10.11.4 保留位7-6 (33)10.11.5 值寄存器装入模式(VLMODE)位5-4 (33)10.11.6 保留位3 (34)10.11.7 Swap45(SWP45)位2 (34)10.11.8 Swap23(SWP23)位1 (34)10.11.9 Swap01(SWP01)位0 (34)10.12 PWM端口寄存器(PMPORT) (34)10.12.1 保留位15-7 (35)10.12.2 保留位6-0 (35)10.13 PWM内部调整控制寄存器(PMICCR) (35)10.13.1 保留位15-3 (35)10.13.2 内部电路控制2(ICC2)位2 (35)10.13.3 内部电路控制1(ICC1)位1 (35)10.13.4 内部电路控制0(ICC0)位0 (36)11.时钟 (36)12.中断 (36)13.复位 (36)1.简介PWM模块可以产生6路独立的或三对互补的PWM输出或二者的混合(例如:一对互补、四个独立的PWM)。
飞思卡尔智能车S12XS128PWM控制程序编写
飞思卡尔智能车S12XS128PWM控制程序编写SeptStringS原创,转载请注明。
对于飞思卡尔智能车,电机和舵机的控制通常使⽤的都是以PWM脉冲宽度调制的⽅法实现的,其可⾏性基于电机可以由占空⽐控制转速,⽽舵机也由脉宽控制摆动。
PWM 调制波有 8 个输出通道,每⼀个输出通道都可以独⽴的进⾏输出。
每⼀个输出通道都有⼀个精确的计数器(计算脉冲的个数),⼀个周期控制寄存器和两个可供选择的时钟源。
每⼀个 PWM 输出通道都能调制出占空⽐从 0—100% 变化的波形。
PWM控制程序的编写⼀般按照以下的⼀种流程:1,禁⽌PWM模块;//这是由于改变周期和脉宽等操作需要在PWM禁⽌的情况下才能被设置2,PWM级联选择,是否级联通道67,45,23,01;//最多单独使⽤8个8位和级联使⽤4个16位3,给通道选择时钟源控制位;//0,1,4,5通道可选择ClockA和ClockSA;2,3,6,7通道可选择ClockB和ClockSB4,给时钟源A\B预分频;//可对总线时钟进⾏预分频,确定ClockA和ClockB,满⾜1,2,4,8,16,32,64,128这8个分频量5,根据时钟源A\B确定时钟源SA\SB;//由ClockA和ClockB、分频设值来确定ClockA和ClockB,满⾜1-255的分频量6,输出极性的选择;//也就是选择输出极性先低后⾼还是先⾼后低7,对齐⽅式的选择;//可设置为左对齐或者中间对齐⽅式8,实际通道频率的计算;//也就是周期的设定9,占空⽐寄存器的设置;//占空⽐常数的设定,可以以此决定占空⽐10,使能PWM模块。
//你已经⾸尾呼应了,有⽊有接下来通过寄存器的介绍,以上⾯流程为⼤纲,详细地说明⼀下该如何操作~~【PWME】寄存器PWME = (PWME~7 | PWME~6 | PWME~5 | PWME~4 | PWME~3 | PWME~2 | PWME~1 | PWME~0)将每⼀位设置为1即可使能该位,0对应的既是禁⽌。