飞思卡尔单片机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

飞思卡尔应用笔记之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(飞思卡尔单片机)

pwm(飞思卡尔单片机)
#include <hidef.h> /* common defines and macros */
#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机理【转】

飞思卡尔 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处,计数器所产生的数字码不是由小到大或由大到小顺序变化,而是将数据分成偶数序列和奇数序列,在一个计数周期,偶数序列由小变大,直到最大值,然后变为对奇数序列计数,变化为由大到小。

飞思卡尔单片机教学

飞思卡尔单片机教学
VDDR、VSSR:电压调整模块及I/O供电,分别接电源和地,之间要接去耦电容
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调光程序一、概述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)

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 的输出。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档