最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 正文

飞思卡尔PWM模块与编程

来源:动视网 责编:小OO 时间:2025-09-25 13:44:53
文档

飞思卡尔PWM模块与编程

飞思卡尔全国智能车制作交流群102662535  人多资料多力量大  只为大家少走弯路,无其他目的手把手教你写S12XS128程序--PWM模块介绍该教程以MC9S12XS128单片机为核心进行讲解,全面阐释该16位单片机资源。本文为第一讲,开始介绍该MCU的PWM模块。PWM调制波有8个输出通道,每一个输出通道都可以的进行输出。每一个输出通道都有一个精确的计数器(计算脉冲的个数),一个周期控制寄存器和两个可供选择的时钟源。每一个PWM输出通道都能调制出占空比从0—100%变化的波形。PW
推荐度:
导读飞思卡尔全国智能车制作交流群102662535  人多资料多力量大  只为大家少走弯路,无其他目的手把手教你写S12XS128程序--PWM模块介绍该教程以MC9S12XS128单片机为核心进行讲解,全面阐释该16位单片机资源。本文为第一讲,开始介绍该MCU的PWM模块。PWM调制波有8个输出通道,每一个输出通道都可以的进行输出。每一个输出通道都有一个精确的计数器(计算脉冲的个数),一个周期控制寄存器和两个可供选择的时钟源。每一个PWM输出通道都能调制出占空比从0—100%变化的波形。PW

飞思卡尔全国智能车制作交流群 102662535  人多资料多力量大  只为大家少走弯路,无其他目的手把手教你写S12XS128程序--PWM模块介绍

该教程以MC9S12XS128单片机为核心进行讲解,全面阐释该16位单片机资源。本文为第一讲,开始介绍该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、每一个通道都可以通过编程实现左对齐输出还是居中对齐输出。

1、PWM启动寄存器PWME

PWME 寄存器每一位如图 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 的输出。

2、PWM时钟选择寄存器PWMCLK

PWMCLK 寄存器每一位如图3 所示:

                                    复位默认值:0000 0000B

图2  PWMCLK 寄存器 

S12的PWM 共有四个时钟源,每一个 PWM 输出通道都有两个时钟可供选择(ClockA、ClockSA 或Clock B、ClockSB))。其中0、1、4、5 通道可选用ClockA和ClockSA,2、3、6、7 通道可选用ClockB、ClockSB 通道。该寄存器用来实现几个通道时钟源的选择。

用法: PCLK0 = 1 --- 通道0(PTP0)的时钟源设为ClockSA

          PCLK2 = 0 --- 通道2(PTP2)的时钟源设为ClockB

1、PWM预分频寄存器PWMPRCLK

PWMPRCLK 寄存器每一位如图3 所示:

                                    复位默认值:0000 0000B

图 3  PWMPRCLK 寄存器 

PWMPRCLK 寄存器包括ClockA预分频和ClockB预分频的控制位。ClockA、ClockB的值为总线时钟的1/2n (0≤n≤7),具体设置参照图4和图5

图 4 Clock A 预分频设置

图5 Clock B 预分频设置

PCKB0~PCKB2  是对ClockB进行预分频。

PCKA0~PCKA2  是对ClockA进行预分频。

2、PWM分频寄存器PWMSCLA、PWMSCLB

PWMSCLA 寄存器每一位如图 6 所示:

图6       PWMSCLA寄存器

Clock SA 是通过对 PWMSCLA 寄存器的设置来对ClockA 进行分频而产生的。其计算公式为:

Clock SA=Clock A /(2*PWMSCLA)

PWMSCLB 寄存器与PWMSCLA 寄存器相似,Clock SB 就是通过对PWMSCLB 寄存器的设置来对 ClockB 进行分频而产生的。其计算公式为:

Clock SB=Clock B /(2*PWMSCLB)

1、PWM极性选择寄存器PWMPOL

PWMPOL 寄存器每一位如图7 所示:

该寄存器是0~7通道PWM输出起始极性控制位,用来设置PWM输出的起始电平。

     用法:PWMPOL_PPOL0=1--- 通道 0 在周期开始时输出为高电平,当计数器等于占空比寄存器的值时,输出为低电平。对外输出波形先是高电平然后再变为低电平。

2、PWM波形对齐寄存器PWMCAE

PWMCAE 寄存器每一位如图 8 所示:

图 8  PWMCAE 寄存器

PWMCAE 寄存器包含 8 个控制位来对每个 PWM 通道设置左对齐输出或中心对齐输出。

用法: PWMCAE_CAE0 = 1 --- 通道0 中心对齐输出

           PWMCAE_CAE7 = 0 --- 通道7 左对齐输出

注意:只有输出通道被关闭后才能对其进行设置,即通道被激活后不能对其进行设置。

1、PWM控制寄存器PWMCTL

PWMCTL 寄存器每一位如图 9 所示:

图 9  PWMCTL 寄存器

 

该控制寄存器设定通道的级联和两种工作模式:等待模式和冻结模式。这两种模式如图10和图11所示。

图10 等待模式

图11 冻结模式

只有当相应的通道关闭后,才能改变 这些控制字。

用法:

PWMCTL_CON67=1 --- 通道 6、7 级联成一个16位的PWM通道。此时只有 7 通道的控制字起作用,原通道7的使能位、PWM输出极性选择位、时钟选择控制位以及对齐方式选择位用来设置级联后的PWM输出特性

PWMCTL_CON67=0 --- 通道 6,7 通道不级联

CON45、CON23、CON01 的用法同 CON67 相似。设置此控制字的意义在于扩大了 PWM 对外输出脉冲的频率范围。

PSWAI=1 ---  MCU 一旦处于等待状态,就会停止时钟的输入。这样就不会因时钟在空操作而费电;当它置为 0,则 MCU 就是处于等待状态,也允许时钟的输入。

PFRZ=1 ---  MCU 一旦处于冻结状态,就会停止计数器工作。

S12微控制器PWM模块是由运行的8位脉冲计数器PWMCNT、两个比较寄存器PWMPER和PWMDTY组成。

1、左对齐方式

在该方式下,脉冲计数器为循环递增计数,计数初值为0 。

当PWM使能后,计数器PWMCNT从0开始对时钟信号递增计数,开始一个输出周期。当计数值与占空比常数寄存器PWMDTY相等时,比较器1输出有效,将触发器置位,而PWMCNT继续计数;当计数值与周期常数寄存器PWMPER相等时,比较器2输出有效,将触发器复位,同时PWMCNT也复位,结束一个输出周期。原理参照图14:

图14  PWM左对齐方式

2、中心对齐方式

在该方式下,脉冲计数器为双向计数,计数初值为0 。

当PWM使能后,计数器PWMCNT从0开始对时钟信号递增计数,开始输出一个周期。当计数器与占空比常数寄存器PWMDTY相等时,比较器1输出有效,触发器翻转,而PWMCNT继续计数,当计数值与周期常数PWMPER相等时,比较器2输出有效,此时改变PWMCNT的计数方向,使其递解计数;当PWMCNT再次与PWMDTY相等时,比较器1再一次输出有效,使触发器再次翻转,而PWMCNT继续递减计数,等待PWMCNT减回至0,完成一个输出周期。原理参照图15:

图15    中心对齐方式

3、周期计算方法

左对齐方式:

输出周期 = 通道周期 × PWMPERx

中心对齐方式:

输出周期 = 通道周期 × PWMPERx × 2

4、脉宽计算方法

左对齐方式:

占空比 = [ (PWMPERx - PWMDTYx) / PWMPERx ] × 100%

中心对齐方式:

占空比 = [ PWMDTYx / PWMPERx ] × 100%

1、PWM通道计数寄存器 PWMCNTx

PWMCNTx 寄存器共有 8个,每一个通道都有一个8位PWM加/减双向计数器,通道级联后可变成16位PWM加/减双向计数器。下面以PWMCNT0为例对 PWMCNTx 寄存器进行介绍。

PWMCNT0 寄存器如图 12 所示:

图 12  PWMCNT0 寄存器 

计数器以所选时钟源的频率运行。计数器在任何时候都可以被读,而不影响计数,也不影响对 PWM 通道的操作。

任何值写入 PWMCNT0 寄存器都会导致计数器复位置 0,且其计数方向会 被设置为向上计数,并且会立刻从缓冲器载入任务和周期值,并会根据翻转极性的设置来改变输出。当计数器达到计数值后,会自动清零。只有当通道使能后,计数器才开始计数。

2、PWM通道周期寄存器PWMPERx

PWMPERx 寄存器共有 8 个,每一个通道都有一个这样的周期寄存器。这个 寄存器的值就决定了相关 PWM 通道的周期。每一个通道的周期寄存器都是双缓 冲的,因此如果当通道使能后,改变他们的值,将不会发生任何作用,除非当下列情况之一发生:

*有效的周期结束。

*对计数器进行写操作(计数器复位)

*通道不可用(PWMEx = 0)

这样就会使 PWM 输出波形要么是新波形要么是旧波形,并不会在两者之间 进行交替变换。如果通道不可用,那么对周期寄存器进行写操作,将会直接

图表 1

导致 周期寄存器同缓冲器一起闭锁。图 13 所示的是 PWMPER0 寄存器:

  

图 13 PWMPER0 寄存器

3、PWM通道占空比寄存器PWMDTYx

PWMDTYx 寄存器也有 8 个,每一个通道都有一个这样的占空比常数寄存 器。这个寄存器的值就决定了相关 PWM 通道输出波形的占空比。每一个通道的 占空比寄存器都是双缓冲的,因此如果当通道被激活后,改变他们的值将不会发生任何作用,除非当下列情况之一发生:

*有效的周期结束。

*对计数器进行写操作(计数器复位)

*通道不可用(PWMEx = 0)

这样就会使 PWM 输出波形要么是新波形要么是旧波形,并不会在两者之间 进行交替变换。如果通道没有被激活,那么对占空比常数寄存器进行写操作,将会直接导致周期寄存器同缓冲器一起闭锁。

当计数值与占空比常数 PWMDTY 相等时,则比较输出器有效,这时就会将触发器置位,然后 PWMCNT 继续计数,当计数值与周期常数 PWMPER 相等时,比较器输出有效,将触发器复位,同时也使 PWMCNT 复位,结束一个输出周期。

S12微控制器PWM模块是由运行的8位脉冲计数器PWMCNT、两个比较寄存器PWMPER和PWMDTY组成。

1、左对齐方式

在该方式下,脉冲计数器为循环递增计数,计数初值为0 。

当PWM使能后,计数器PWMCNT从0开始对时钟信号递增计数,开始一个输出周期。当计数值与占空比常数寄存器PWMDTY相等时,比较器1输出有效,将触发器置位,而PWMCNT继续计数;当计数值与周期常数寄存器PWMPER相等时,比较器2输出有效,将触发器复位,同时PWMCNT也复位,结束一个输出周期。原理参照图14:

图14  PWM左对齐方式

2、中心对齐方式

在该方式下,脉冲计数器为双向计数,计数初值为0 。

当PWM使能后,计数器PWMCNT从0开始对时钟信号递增计数,开始输出一个周期。当计数器与占空比常数寄存器PWMDTY相等时,比较器1输出有效,触发器翻转,而PWMCNT继续计数,当计数值与周期常数PWMPER相等时,比较器2输出有效,此时改变PWMCNT的计数方向,使其递解计数;当PWMCNT再次与PWMDTY相等时,比较器1再一次输出有效,使触发器再次翻转,而PWMCNT继续递减计数,等待PWMCNT减回至0,完成一个输出周期。原理参照图15:

图15    中心对齐方式

3、周期计算方法

左对齐方式:

输出周期 = 通道周期 × PWMPERx

中心对齐方式:

输出周期 = 通道周期 × PWMPERx × 2

4、脉宽计算方法

左对齐方式:

占空比 = [ (PWMPERx - PWMDTYx) / PWMPERx ] × 100%

中心对齐方式:

占空比 = [ PWMDTYx / PWMPERx ] 

× 100%

PWM 初始化步骤总结

1、禁止PWM PWME = 0

2、选择时钟 PWMPRCLK,PWMSCLA,PWMSCLB,PWMCLK

3、选择极性 PWMPOL

4、选择对齐方式 PWMCAE

5、选择占空比和周期   PWMDTYx, PWMPERx

6、使能PWM PWME = 1

【例程1】

//------------------------------------------------------------------------------------------------------------------//

//功能说明:MC9S12XS128--PWM例程

//使用说明:实现通道3(PTP3)输出频率为1KHz,占空比为50%的方波,用示波器观察

//程序设计:电子设计吧【www.dzsj8.com】

//设计时间:2010.01.21

//----------------------------------------------------------------------------------------------------------------//

#include       /* common defines and macros */

#include "derivative.h"      /* derivative-specific definitions */

//--------------初始化函数----------------//

//-----时钟初始化程序--------//

void PLL_Init(void)   //PLLCLK=2*OSCCLK*(SYNR+1)/(REFDV+1)

{                     //锁相环时钟=2*16*(2+1)/(1+1)=48MHz

  REFDV=1;            //总线时钟=48/2=24MHz

 SYNR=2;

  while(!(CRGFLG&0x08));

  CLKSEL=0x80;        //选定锁相环时钟

}

//-----PWM初始化程序------//

void PWM_Init(void) 

{

  PWME_PWME3=0x00;  // Disable  PWM            禁止             

  PWMPRCLK=0x33;    // 0011 0011 A=B=24M/8=3M  时钟预分频寄存器设置

  PWMSCLA=150;      // SA=A/2/150=10k          时钟设置

  PWMSCLB=15;       // SB=B/2/15 =100k         时钟设置                    

  PWMCLK_PCLK3=1;   // PWM3-----SB             时钟源的选择

  PWMPOL_PPOL3=1;   // Duty=High Time          极性设置

  PWMCAE_CAE3=0;    // Left-aligned            对齐方式设置

  PWMCTL=0x00;      // no concatenation        控制寄存器设置 

  PWMPER3=100;      // Frequency=SB/100=1K     周期寄存器设置

  PWMDTY3=50;       // Duty cycle = 50%        占空比寄存器设置

  PWME_PWME3=1;     // Enable  PWM             使能

}

//-----------------主函数--------------------//

void main(void)

{

  /* put your own code here */

   PLL_Init();

  PWM_Init();

EnableInterrupts;

  for(;;) {

    _FEED_COP(); /* feeds the dog */

  } /* loop forever */

  /* please make sure that you never leave main */

}

爱上飞思卡尔
手把手教你写S12XS128程序--A/D转换模块介绍

1、A/D转换原理

A/D转换的过程是模拟信号依次通过取样、保持和量化、编码几个过程后转换为数字格式。

a)取样与保持

一般取样与保持过程是同时完成的,取样-保持电路的原理图如图16所示,由输入放大器A1、输出放大器A2、保持电容CH和电子开关S组成,要求 AV1 * AV2 =  1。原理是:当开关S闭合时,电路处于取样阶段,电容器充电,由于 AV1 * AV2 =  1,所以输出等于输入;当开关S断开时,由于A2输入阻抗较大而且开关理想,可认为CH没有放电回路,输出电压保持不变。

图16  取样-保持电路

取样-保持以均匀间隔对模拟信号进行抽样,并且在每个抽样运算后在足够的时间内保持抽样值恒定,以保证输出值可以被 A/D 转换器精确转换。

b)量化与编码

量化的方法,一般有舍尾取整法和四舍五入法,过程是先取顶量化单位Δ,量化单位取值越小,量化误差的绝对值就越小,具体过程在这里就不做介绍了。将量化后的结果用二进制码表示叫做编码。

2、A/D转换器的技术指标

a)分辨率

分辨率说明A/D转换器对输入信号的分辨能力,理论上,n位A/D转换器能区分的输入电压的最小值为满量程的 1/2n 。也就是说,在参考电压一定时,输出位数越多,量化单位就越小,分辨率就越高。S12的ATD模块中,若输出设置为8位的话,那么转换器能区分的输入信号最小电压为19.53mV。

b)转换时间

A/D转换器按其工作原理可以分为并联比较型(转换速度快ns级)、逐次逼近型(转换速度适中us级)、双积分型(速度慢抗干扰能力强)。

不同类型的转化的A/D转换器转换时间不尽相同,S12的ATD模块中,8位数字量转换时间仅有6us,10位数字量转换时间仅有7us。

S12内置了2组10位/8位的A/D模块:ATD0和ATD1,共有16个模拟量输入通道,属于逐次逼近型A/D转换器(这个转换过程与用天平称物的原理相似)。

1、功能结构图

图17  A/D 模块功能结构图

     图17所示的是 A/D 模块的功能结构,这个功能模块被虚线划分成为图示所示的虚线所隔离的三个部分:IP 总线接口、转换模式控制/寄存器列表,自定义模拟量。

IP 总线接口负责该模块与总线的连接,实现 A/D 模块和通用 I/O 的目的, 还起到分频的作用;

转换模式控制寄存器列表中有控制该模块的所有的寄存器,执行左右对齐运 行和连续扫描。

自定义模拟量负责实现模拟量到数字量的转换。包括了执行一次简单转换所 需的模拟量和数字量。

2、 HCS12 中A/D转化模块特点

8/10 位精度;7 us, 10-位单次转换时间.;采样缓冲放大器;可编程采样时间; 左/右对齐,  有符号/无符号结果数据;外部触发控制;转换完成中断;模拟输入 8 通道复用;模拟/数字输入引脚复用;1 到 8 转换序列长度;连续转换模式;多通 道扫描方式。

ATD 模块有模拟量前端、模拟量转换、控制部分及结果存储等四部分组成。其中模拟前端包括多路转换开关、采样缓冲器、放大器等,结果存储部分主要有8个 16 位的存储器和反映工作状态的若干标志位。

1、ATD0控制寄存器2---ATD0CTL2

ATD0CTL2主要控制ATD0的启动、状态标志以及上电模式,对寄存器进行写操作时,将中断当前的转化过程。寄存器ATD0CTL2如图18所示:

图18  ATD0CTL2寄存器

ADPU:A/D 使能控制位,相当于一个开关,用来启动/禁止A/D转换

1 = A/D 模块上电

0 = 禁止 A/D,以减少功耗

AFFC:A/D 快速转换完成标志位清零

1 =  快速标志位清零顺序,每次读取结果寄存器自动清零

0 =  正常标志位清零顺序,需要软件方式对状态标志位清零

AWAI:A/D  等待模式

       1 =  等待模式下,ATD继续运行

  0 =  等待模式下,ATD停止运行,以降低功耗

ETRIGP、ETRIGLE、ETRIGE:

ETRIGLE        ETRIGP        ETRIGE        描述

x        x        0        忽略外部触发

0        0        1         下降沿触发

0        1        1        上升沿触发

1        0        1        低电平触发

1        1        1        高电平触发

【注意】ETRIGE:外部触发使能控制位,该功能借助引脚AN7,当AN7接收到外部触发时,启动A/D转换,否则不进行转换。0--忽略外部触发;1--有外部触发时开始转换,此时AN7不能用于A/D转换。

ASCIE:A/D  转化序列转换结束中断使能控制位

       1 = 允许ATD转换序列转换结束后发生中断

    0 = 禁止ATD 中断

ASCIF:A/D转换序列转换结束中断标志,只用于读。

    1 = 发生中断

0 = 为发生中断        

2、ATD0控制寄存器3---ATD0CTL3

ATD0CTL3主要控制结果寄存器的映射,设置转换序列的长度,还可以暂时冻结ATD0模块,尤其确定ATD0在BDM状态下的行为。寄存器ATD0CTL3如图19所示:

图19  ATD0CTL3寄存器

S1C、S2C、S4C、S8C:转换序列长度选择位控制位

【注意】ATD的每次启动要进行若干次扫描循环,每次扫描循环称为一个转换序      列。

FIFO:结果寄存器 FIFO模式控制位,

1 =  结果寄存器映射到转换序列

0 =  结果寄存器没有映射到转换序列

FRZ0、FRZ1:背景调试冻结控制位

        FRZ        Response

        00        Ignore IFREEZE(冻结模式下继续转换)

        01        Reserved(冻结模式下保留)

        10        Finish conversion then freeze(完成转换后冻结)

        11        Freeze Immediately(冻结模式下立刻冻结)

3、ATD0控制寄存器4---ATD0CTL4

ATD0CTL4用于选择时钟,选择采样转换时间以及选择8位/10位转换方式。寄存器ATD0CTL4如图20所示:

图20  ATD0CTL4寄存器

SRES8 : A/D 精度选择控制位

1 = 将采集到的模拟量以8位二进制数表示

0 = 将采集到的模拟量以10位二进制数表示

SMP0、SMP1 : 采样时间选择控制位

SMP [1:0]        采样时间

00        2 A/D 时钟周期

01        4 A/D 时钟周期

10        8 A/D 时钟周期

11        16 A/D 时钟周期

PPS[0:4] : 5 位 模数计数器预分频器

-  分频系数从 2 到 

-  A/D时钟计算公式 :ATDClock = BusClock/(PRS + 1) × 0.5

-  A/D时钟频率应满足: 

【注意】对于AD转换来说,它的转换周期包括采样时间和运算时间。如果频率太高,则采样时间过短。这对于输出阻抗比较大或信号频率比较高的信号来说,就会产生较大的采样误差,那么AD转换的精度就会受较大的影响。

  

4、ATD0控制寄存器4---ATD0CTL5

ATD0CTL5用于选择转换方式,选择转换通道,设置单/多通道转换和单次/连续转换模式以及对齐方式。寄存器ATD0CTL5如图20所示:

5、ATD0状态寄存器5---ATD0START0、ATD0START0

ATD0START0反映当前的转换通道、A/D转换是否结束、是否有外部触发等;

ATD0START1反映转换序列中相应的转换是否完成。寄存器ATD0START0、ATD0START1如图21所示: 

SCF ---转换序列完成标志

       在单次转换模式时,当转换完成后置位 (SCAN = 0)

       在连续转换模式时,当第一次转换完成后置位 (SCAN = 1),当AFFC = 0,写 1 清零。

ETORF ---外部触发覆盖标志

   如果在转换过程中高/低电平出现,置位 FIFOR

   当结果寄存器在读出之前已经被写入时,置位 ( CCF 没有清零) 

CC[2:0]转换计数器---3位计数器指向下一个将要转换的通道 

CCF7 -CCF0 ---通道转换完成标志位每个相应的通道转换结束后置位,当相应的 A/D 结果寄存器被读出时,清零,注意当 AFFC 位不同时的情况

第十六讲:A/D转换应用实例

要让 ATD 开始转换工作,必须经过以下三个步骤:

1.将 ADPU 置 1,使 ATD 启动;

2.按照要求对转换为数、扫描方式、采样时间、时钟频率及标志检查等方式 进行设置;

3.发出启动命令;

如果上电默认状态即能满足工作要求,那么只要将 ADPU 置 1,然后通过控 制寄存器发出转换命令,即可实现转换。

【例程2】

程序描述:由通道ATD0进行单通道A/D转换,转换值在B口显示

程序如下:

#include       /* common defines and macros */

#include      /* derivative information */

#pragma LINK_INFO DERIVATIVE "mc9s12dg128b"

/******定义变量********/

word AD_wValue;//AD转换结果

/*时钟初始化*/

void PLL_Init(void)      //PLLCLK=2*OSCCLK*(SYNR+1)/(REFDV+1)

{                     //锁相环时钟=2*16*(2+1)/(1+1)=48MHz

  REFDV=1;           //总线时钟=48/2=24MHz

  SYNR=2;

  while(!(CRGFLG&0x08));

  CLKSEL=0x80;

}

/*AD初始化*/

void AD_Init(void)     

{

  ATD0CTL2=0xC0;  // 启动A/D, 快速清零, 无等待模式, 禁止外部触发, 中断禁止

  ATD0CTL3=0x20;  // 转换序列长度为4, No FIFO, Freeze模式下继续转换

  ATD0CTL4=0x85; // 8位精度, 2个时钟, ATDClock=[BusClock*0.5]/[PRS+1]=2MHz

RS=5,divider=12

  ATD0CTL5=0xA0;  // 右对齐无符号,单通道采样,通道0 

  ATD0DIEN=0x00;  // 禁止数字输入

}

/*读取AD转换结果*/

void AD_GetValue(word *AD_wValue) 

{

  *AD_wValue=ATD0DR0;  //读取结果寄存器的值

}

/**********主函数**************/

void main(void) 

{

  PLL_Init();

  AD_Init();          

  DDRB=0xFF;  

  PORTB=0x00; 

  EnableInterrupts;  

  for(;;)

  {

    while(!ATD0STAT1_CCF0);    // 等待转换结束while(ATDOSTAT1_CCF0==1)

        AD_GetValue(&AD_wValue);   // 读取转换结果

    PORTB = (byte)AD_wValue;   // 在B口显示转换值

  } 

}

爱上飞思卡尔

文档

飞思卡尔PWM模块与编程

飞思卡尔全国智能车制作交流群102662535  人多资料多力量大  只为大家少走弯路,无其他目的手把手教你写S12XS128程序--PWM模块介绍该教程以MC9S12XS128单片机为核心进行讲解,全面阐释该16位单片机资源。本文为第一讲,开始介绍该MCU的PWM模块。PWM调制波有8个输出通道,每一个输出通道都可以的进行输出。每一个输出通道都有一个精确的计数器(计算脉冲的个数),一个周期控制寄存器和两个可供选择的时钟源。每一个PWM输出通道都能调制出占空比从0—100%变化的波形。PW
推荐度:
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top