本帖最后由 刘骁奖 于 2013-7-31 11:17 编辑
1元钱造出高分辨率D/A 刘骁奖
摘要:本文介绍一款使用16F690的PWM功能,配合LM358运放,制作的一款廉价10Bit D/A转换器,提供0~5V,0~10V的电压输出。 关键词:D/A转换器;PWM;0~5V,0~10V;16F690;
引言 一种将二进制数字量形式的离散信号转换成以标准量(或参考量)为基准的模拟量的转换器,简称 DAC 数模转换器。提到DAC数模转换器,任何一个电子相关专业的人,都耳熟能详,太基础了,这有什么好讲的呢!我想看到这篇**的人都会这么想。这里我提二点说明一下,为什么花时间来写这么一篇**:第一,因为太过基础,都是讲讲原理,没有完整的电路图可以拿来直接用;第二,成本,这个是中国BOSS们用来判定你是不是个合格工程师的最重要指标。
1 PWM转D/A理论分析 1.1 转换原理 PWM是一种周期固定,而高低电平占空比可调的方波信号。PWM通过简单的RC滤波网络可以得到与信号占空比成线性关系的直流电压,从而实现D/A转换。如下图所示: 图1:PWM到D/A转换器输出原理图
滤波电路中的R,C参数与PWM的周期以及直流电压的精度要求直接相关。处于瞬态时Vin在高电平持续时间内向电容充电,电容积累电荷,在低电平持续电间内电容向Vin放电,电容释放电荷。电容积累的电荷数多于释放的电荷数。因此电容两端的直流电压不断爬升,最终达到稳态。处于稳态时,电容积累的电荷与释放的电荷数量相等,因此电压会在一个稳定的电压值附近做小幅度的波动,忽略这样的纹波,则电容两端的电压与PWM占空比呈线性关系。 1.1.1 PWM信号可以用分段函数表示 (式1) 其中:T是单片机中计数脉冲的基本周期,即单片机每隔T时间记一次数(计数器的值增加或者减少1),N是PWM波一个周期的计数脉冲个数,n是PWM波一个周期中高电平的计数脉冲序号, VH和VL分别是PWM波中高低电平的电压值,k为整个周期波序号,t为时间。为了对PWM信号的频谱进行分析,以下提供了一个设计滤波器的理论基础。把式(1)所表示的函数展开傅里叶级数,得到式(2) (式2) 从式(2)可以看出,式中第一个方括弧为直流分量,第二项为第一次谐波分量,第三项为大于一次的高次谐波分量。式(2)中的直流分量与n从0到N,直流分量在VL~VL+VH变化,这正是电压输出的D/A转换器所需要的。因此,如果能把式(2)中除直流分量的谐波过滤掉,则可以得到从PWM波到电压输出D/A转换器的转换,即PWM波可以通过一个低通滤波器进行调解。式(2)中的第二项的幅度和相角与n有关,频率为1/ NT,该频率是设计低通滤波器的依据。如果能把1次谐波很好的过滤掉,则高次谐波就应该基本不存在了。
1.1.2 转换器分辨率及误差分析
PWM到D/A转换器输出的误差来源受两方面制约:决定D/A转换器分辨率的PWM信号的基频和没有被低通滤波器滤除的纹波。在D/A转换器的应用中,分辨率是一个很重要的参数,分辨率计算直接与N和n的可能变化有关,计算公式如下: (式3) 其中RBits是分辨率,nmin是指n的最小变化量,具体见下表。 可以看出,N越大D/A转换器的分辨率越高,但是NT也越大,PWM的周期也就越大,即PWM的基频降低。但是,基频降低,式(2)中的1次谐波周期也就越大,相当于1次谐波的频率也越低,也就会有更多的谐波通过相同的带宽的低通滤波器,需要截止频率很低的低通滤波器,造成输出的直流分量的纹波更大,导致D/A转换器转换的分辨率降低,D/A转换器输出滞后也将增加。所以,单纯降低PWM信号的频率也不能获得较高的分辨率。一种解决方法就是使T减小,即较小单片机的计数脉冲宽度(这往往需要提高单片机的工作频率),在不降低1次谐波频率的前提下提高精度。在实际中,T的较小受到单片机时钟和PWM后续电路开关特性的限制。如果在实际中需要微妙级的T,则后续电路需要选择开关特性很好的器件,以减小PWM波形的失真。 通过以上分析可知,基于PWM输出的D/A转换器转换输出的误差,取决于通过低通滤波器的高频分量所产生的纹波和PWM信号的高电平稳定度这两个方面。为获得最佳的D/A转换器转换效果,在选取PWM信号的频率时要适当的折衷,太小,分辨率高,但滤波器需要更低的截止频率,同时限制了输入PWM信号的变化频率;太大,则分辨率下降。
1.2 信号处理 从PWM到D/A转换器输出信号处理方块图,根据该方块图可以有许多电路实现方法,在单片机的应用中还可以通过软件的方法进行精确度调整和误差的进一步校正。
图2:PWM到D/A转换器输出信号处理方块图
这里重点说一下,电压采样这块,这是本套电路不可缺少的部分。电路采用分离元件搭建,受环境、器件老化、器件差异等影响,电路产生的模拟电压往往和理论数值存在一定误差,随着时间飞驰,误差会逐渐增大。专用的D/A芯片,相对比较稳定一些,这类芯片,比如,MCP4801、MCP4811、MCP4821价格都在5块*币以上,为了在中国做个合格攻城狮,和这些专用的片子,说拜拜吧。 怎么办呢?刚才提到的那个电压采样就成了救命稻草,它是干什么用的呢?其实很简单就是用来做反馈控制的。先复习一下控制论的反馈控制概念。(反馈控制原理是指在反馈控制系统中,控制装置对被控对象施加的控制作用,是取自被控量的反馈信息,用来不断修正被控量与输入量之间的偏差,从而实现对被控对象进行控制的任务,这就是反馈控制原理。)具体一点,就是把运放放大输出的模拟信号再通过AD采集回来,和输出做对比,算出一个修正值,下次PWM再输出的时候加上这个修正值就可以了,然后每次输出不断重复上面的步骤就可以了。比如,我要输出一个3V电压,输出后,AD采样回来计算发现是3.1V,那么下次PWM输出时,PWM的占空比适当减小,减去这个0.1V的误差就可以了。如果,你的产品需要量产,这个功能,千万不可省掉。
2 设计案例 2.1 芯片资料 2.1.1 LM358概述 LM358内部包括有两个独立的、高增益、内部频率补偿的双运算放大器,适合于电源电压范围 很宽的单电源使用,也适用于双电源工作模式,在推荐的工作条件下,电源电流与电源电压无关。它的使用范围包括传感放大器、直流增益模块和其他所有可用单电源供电的使用运算放大器的场合。LM358的封装形式有塑封8引线双列直插式和贴片式。
图3:LM358脚位排列图
• 内部频率补偿 • 直流电压增益高(约100dB) • 单位增益频带宽(约1MHz) • 电源电压范围宽:单电源(3—30V); 双电源(±1.5一±15V) • 低功耗电流,适合于电池供电 • 低输入偏流 • 低输入失调电压和失调电流 • 共模输入电压范围宽,包括接地 • 差模输入电压范围宽,等于电源电压范围 • 输出电压摆幅大(0至Vcc-1.5V) 2.1.2 16F690概述 高性能RISCCPU • 仅需学习35 条指令: - 除了跳转指令以外,所有指令都是单周期的 • 工作速度: - DC- 20 MHz 振荡器/ 时钟输入 - DC- 200 ns 指令周期 • 中断能力 • 8级深硬件堆栈 • 直接、间接和相对寻址方式 图4:PIC16F690脚位排列图 单片机特性 • 精确的内部振荡器: - 出厂时精度已校准到±1% - 软件可选择频率范围:8 MHz 到32 kHz - 可用软件调整 - 双速启动模式 - 用于关键应用的晶振故障检测 - 时钟模式切换以使器件省电运行 • 省电休眠模式 • 宽工作电压范围(2.0V-5.5V) • 工业级和扩展级温度范围 • 上电复位(Power-on Reset, POR) • 上电延时定时器(Power-up Timer,PWRTE)和振荡器起振定时器(Oscillator Start-up Timer,OST) • 带软件控制选择的欠压复位(Brown-out Reset,BOR) • 增强型低电流看门狗定时器(Watchdog Timer,WDT),带有片上振荡器(预分频器最大时,软件可选 择的标称值为268 秒),可用软件启动 • 复用式主复位/ 输入引脚 • 可编程代码保护 • 高耐久性的闪存/EEPROM 存储单元: - 闪存耐写次数达100,000 次 - EEPROM 耐写次数达1,000,000 次 - 闪存/ 数据EEPROM 的数据保持期>40 年 • 增强型USART 模块: - 支持RS-485、RS-232 和LIN2.0 - 自动波特率检测 - 遇到起始位时自动唤醒 低功耗特性: • 待机电流: - 2.0V时典型值为50 nA • 工作电流: - 32kHz、2.0V时典型值为11 μA - 4MHz、5.5V时典型值220 μA • 看门狗定时器电流: - 2.0V时典型值<1 Μa 外设特性: • 17个I/O引脚和1 个只用作输入的引脚: - 高灌/ 拉电流能力,可直接驱动LED - 引脚电平变化中断 - 独立可编程弱上拉 - 超低功耗唤醒(Ultra Low-Power Wake-up,ULPWU) • 模拟比较器模块,具有: - 2个模拟比较器 - 片上可编程比较器参考电压(CVREF)模块(VDD 的%) - 可从外部访问比较器输入和输出 - SR锁存器模式 - Timer1门控同步锁存器 - 固定0.6V 的VREF • A/D转换器: - 10位精度, 12 路通道 • Timer0:带有8 位可编程预分频器的8 位定时器/ 计数器 • 增强型Timer1: - 带有预分频器的16 位定时器/ 计数器 - 外部Timer1 门控(计数使能) - 如果选用INTOSC 模式,在LP 模式中可选择OSC1或OSC2 作为Timer1 的振荡器 • Timer2:带有8 位周期寄存器、预分频器和后分频器的8 位定时器/ 计数器 • 增强型捕捉、比较和PWM+ 模块: - 16位捕捉,最大精度12.5 ns - 比较,最大精度200 ns - 10位PWM,带有1、2 或4 路输出通道及可编程“死区”,最高频率20 kHz - PWM输出转向(Steering)控制 • 同步串行口(Synchronous Serial Port, SSP): - SPI 模式(主控和从动) • I2C™ (主/ 从模式): - I2C™ 地址屏蔽 • 通过两个引脚进行在线串行编程(In-Circuit Serial ProgrammingTM, ICSPTM)
2.2 电路设计
硬件需要MCU有一路PWM、一路AD(反馈控制)、1片LM358、6个电阻、3个电容。除去MCU,剩下的器件整体价格不足1元*币。
图5:使用LM358的0~10V电压输出原理图 2.3 软件设计 软件基本写不了几行代码,因为直接用MCU内部集成的PWM模块,配置一下就行。下图是16F690的PWM模块功能框图,很强大。你可以把一路PWM输出,同时配置到四个管脚去。这款芯片更适合控制电机。 图6:PIC16F690 增强型PWM模式的简化框图 图7:PIC16F690PWM频率和分辨率
要得到更分辨率,必须降低PWM频率。要得到更高PWM频率,必须降低分辨率。可通过下表数字的细微变化,了解这个概念。当使用外部4MHZ晶体,TMR2定时器,预分频比为1,PWM频率3.9KHZ,可以获得最大10BIT分辨率的占空比,PWM周期256US。 图8:PIC16F690PWM参数计算,使用Excel生成
图9:PIC16F690CCP PWM输出状态 2.3.1 PWM 工作的设置 应按照以下步骤将CCP 模块配置为PWM 工作: 1. 将相关的TRIS 位置1 禁止PWM 引脚(CCP1)的输出驱动器。 2. 装裁PR2 寄存器以设置PWM 周期。 3. 用适当的值装载CCP1CON 寄存器将CCP 模块配置为PWM 模式。 4. 装载CCPR1L 寄存器和CCP1CON 寄存器的DC1B<1:0> 设置PWM 占空比。 5. 配置并启动Timer2: • 将PIR1 寄存器的TMR2IF 中断标志位清零。 • 装载T2CON寄存器的T2CKPS位设置Timer2预分频比。 • 将T2CON 寄存器的TMR2ON 位置1 使能Timer2。 6. 重新开始一个PWM 周期后,使能PWM 输出: • 等待Timer2 溢出(PIR1 寄存器的TMR2IF 位置1)。 • 将相关的TRIS位清零使能CCP1引脚的输出驱动器。
2.3.2 代码 下面PWM函数,定时运行,比如5MS运行一次,函数中的Value参数,分辨率为10bit,范围是0~1023,如果你只需要一个8Bit分辨率,那么DC1B0,DC1B1就不用去操作它,直接操作CCPR1L,范围是0~255,根据文中提供的电路图,可以认为是0~10V的模拟量输出。 反馈控制部分,通过AD采样输出电压,算出偏差,将偏差值与Value做运算。Value中保存最终输出的占空比值。然后定时调用下面PWM输出函数即可。
void Pwm(unsigned int value) { TRISC5= 0; //P1A配置成PWM输出管脚 PR2= 0Xff; //4MHZ外晶体,PWM频率3.9KHZ,分辨率10BIT,周期256US,TMR2预分频1 CCP1CON= 0X0C; T2CON= 0B00000100; DC1B0= value&0x0001; //PWM占空比的低2位,在DC1B0、DC1B1中,高8位在CCPR1L中 Value>>=1; DC1B1= value&0x0001; Value>>=1; CCPR1L= value&0x00ff; PSTRCON= 1; //脉冲转向控制寄存器,可以把1路PWM,任意输出到P1A、P1B、P1C、P1D }
3.后续 花了几天时间整理这篇文字,希望对读到这些文字的朋友们,有所帮助!最近读完《沃兹传》,Apple创始人之一。推荐工程师们读读,我引用一段共勉,做为结束语吧…… (以下内容,摘录自《沃兹传》) 为什么我说工程师像是艺术家?工程师常常醉心于完美的设计。在工程师的作品中,每一个微小的元器件、每一行代码的存在都是有理由的,工程师们追求直接、简短、快速的实现方式。工程师对完美的设计的追求,对前人从未达到的技术高度的执着,使工程师成为真正的艺术家。 大多数人并不觉得工程师是艺术家,在他们看来,工程师仅仅与他们所制造出的各种仪器相关。但若没有工程师的精心设计,没有那种用最少元器件来制造出最好的东西的执着态度,我们根本无法享有那些具有智能的优美仪器。这正是工程学的精妙之处。
参考文献: [1] [美]史蒂夫﹒沃兹尼亚克等 沃兹传[M]. 北京:中信出版社,2013-06 [2] PIC16F690数据手册 [3] LM358 数据手册 [4] 百度文库
|