智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 36931|回复: 160
打印 上一主题 下一主题

[资源] 光电组看过来~~PWM和AD模块

  [复制链接]

12

主题

42

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
3818

论坛元老奖章

QQ
威望
304
贡献
3486
兑换币
0
注册时间
2010-2-19
在线时间
14 小时
跳转到指定楼层
1#
发表于 2010-3-12 13:07:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
飞思卡尔全国智能车制作交流群 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 寄存器

12

主题

42

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
3818

论坛元老奖章

QQ
威望
304
贡献
3486
兑换币
0
注册时间
2010-2-19
在线时间
14 小时
2#
 楼主| 发表于 2010-3-12 13:08:13 | 只看该作者
该控制寄存器设定通道的级联和两种工作模式:等待模式和冻结模式。这两种模式如图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 <hidef.h>      /* 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 */
}
回复 支持 反对

使用道具 举报

12

主题

42

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
3818

论坛元老奖章

QQ
威望
304
贡献
3486
兑换币
0
注册时间
2010-2-19
在线时间
14 小时
3#
 楼主| 发表于 2010-3-12 13:08:24 | 只看该作者
手把手教你写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 到 64
-  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 <hidef.h>      /* common defines and macros */
#include <mc9s12dg128.h>     /* 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]=2MHzRS=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口显示转换值
  }
}
回复 支持 反对

使用道具 举报

21

主题

1019

帖子

0

精华

常驻嘉宾

我爱雯婕

Rank: 8Rank: 8

积分
4657
威望
2223
贡献
1682
兑换币
4
注册时间
2009-3-4
在线时间
376 小时
4#
发表于 2010-3-12 15:07:26 | 只看该作者
回复 3# smile_keyang
支持原创,不过有点乱,图片也没法显示,用word整理一下再发上来更好。
回复 支持 反对

使用道具 举报

3

主题

142

帖子

0

精华

高级会员

Rank: 4

积分
554
QQ
威望
371
贡献
67
兑换币
0
注册时间
2010-3-2
在线时间
58 小时
5#
发表于 2010-3-12 19:40:50 | 只看该作者
支持
回复 支持 反对

使用道具 举报

1

主题

31

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
371
QQ
威望
316
贡献
43
兑换币
16
注册时间
2010-1-15
在线时间
6 小时
6#
发表于 2010-3-12 20:15:42 | 只看该作者
好东西。。。
回复 支持 反对

使用道具 举报

4

主题

167

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
436
威望
347
贡献
47
兑换币
2
注册时间
2008-12-20
在线时间
21 小时
7#
发表于 2010-3-12 23:48:21 | 只看该作者
支持,支持,好东西,有助于我们新手学习
回复 支持 反对

使用道具 举报

140

主题

1016

帖子

2

精华

功勋会员

智能车八届元老!武汉岱默科技创始人!

Rank: 10Rank: 10Rank: 10

积分
32723

特殊贡献奖章资源大师奖章论坛骨干奖章推广达人奖章优秀版主奖章热心会员奖章论坛元老奖章在线王奖章活跃会员奖章优秀会员奖章

QQ
威望
4239
贡献
25778
兑换币
1456
注册时间
2009-12-9
在线时间
1353 小时
8#
发表于 2010-3-13 00:53:28 | 只看该作者
转载请注明出处!
回复 支持 反对

使用道具 举报

4

主题

241

帖子

0

精华

高级会员

Rank: 4

积分
602
QQ
威望
478
贡献
66
兑换币
2
注册时间
2010-1-18
在线时间
29 小时
9#
发表于 2010-3-13 09:34:16 | 只看该作者
好!
回复 支持 反对

使用道具 举报

0

主题

27

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
258
威望
197
贡献
25
兑换币
0
注册时间
2008-3-5
在线时间
18 小时
10#
发表于 2010-3-13 09:50:40 | 只看该作者
回复  smile_keyang
支持原创,不过有点乱,图片也没法显示,用word整理一下再发上来更好。
chenrunshe_007 发表于 2010-3-12 15:07



    严重同意!!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关于我们|联系我们|小黑屋|智能车制作 ( 黑ICP备2022002344号

GMT+8, 2024-11-5 16:10 , Processed in 0.144602 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表