实验九:定时器输出PWM模拟DAC

上传人:德****1 文档编号:1083541 上传时间:2017-05-27 格式:PDF 页数:7 大小:1.14MB
返回 下载 相关 举报
实验九:定时器输出PWM模拟DAC_第1页
第1页 / 共7页
实验九:定时器输出PWM模拟DAC_第2页
第2页 / 共7页
实验九:定时器输出PWM模拟DAC_第3页
第3页 / 共7页
实验九:定时器输出PWM模拟DAC_第4页
第4页 / 共7页
实验九:定时器输出PWM模拟DAC_第5页
第5页 / 共7页
点击查看更多>>
资源描述

《实验九:定时器输出PWM模拟DAC》由会员分享,可在线阅读,更多相关《实验九:定时器输出PWM模拟DAC(7页珍藏版)》请在金锄头文库上搜索。

1、华南理工大学无线电爱好者协会 AVR-R&D V2.1 QQ群:63191815 Editor:*轩辕十四* Created date:2010-2-9 - 1 - 实验九:定时器输出PWM模拟DAC 一、 实验目的 1、 进一步熟悉AVR单片机内部定时器的PWM配置方法; 2、 掌握用PWM波模拟DAC的原理。 二、 实验原理 实验八中,利用定时器1输出了频率固定的1.5kHz的占空比为50%的方波,驱动蜂鸣器发声,它应用了10位快速PWM模式,该模式下修改占空比非常方便,只要修改OCR1A的值即可。 PWM波在实际电路中用途广泛,如驱动调速电机、驱动调光LED灯等,PWM调节系统更是开关电

2、源的核心之一,本实验介绍使用PWM模拟DAC。 PWM波是一种占空比可调的方波,它有两个基本参数:频率f和占空比D,还有一个参数时幅度A,一般PWM波,高电平就等于A,低电平就是0V,占空比表示一个周期内高电平时间所占的比例。将PWM进行傅里叶变换,它由3大部分组成: 1、 直流分量,大小为 A*D,即幅度乘以占空比; 2、 基波,即频率与PWM频率相同的正弦波,幅度最大为1/,具体与占空比D有关; 3、 高次谐波。基波频率为 f,谐波以N*f的频率出现,如二次谐波、三次谐波,直到无穷大次谐波,次数越高,谐波的幅度就越小。 由上可知,PWM波中的直流分量为A*D,A为高电平的幅度,一般波动不大

3、,D为占空比,调节相对容易,因此PWM中的直流分量可以进行DAC的模拟,关键在于消除PWM波中基波和高次谐波的影响,这可以通过一个低通滤波器来实现。 由PWM波的频谱结构,其最低低频的频率分量为基波f,我们只要使用一个截止频率低于f,衰减足够大的低通滤波器,然后使PWM通过该滤波器,便输出了目标的直流分量, PWM 波的频率在 kHz 级别,这个滤波器很容易设计,开发板上使用了一个最简易的 4 阶RC无源滤波器,如图: R21R23 和 3 个 10uF 电 容 构 成 了 3 阶 滤 波 器 , 截 止 频 率 为HzHzukRCf 6.1101014.32 12 1 ,R24 和 0.1u

4、F 构成高频吸收滤波器,补偿因电解电容的电感效应引起的高频衰减不足。PD7是定时器2的PWM输出端口。 本实验中,从 PD7 输出 PWM 波,经过低通后变成目标直流电压,这个电压输入 PA7华南理工大学无线电爱好者协会 AVR-R&D V2.1 QQ群:63191815 Editor:*轩辕十四* Created date:2010-2-9 - 2 - (参见实验七的ADC例程),PA7捕获这个电压送入内部ADC进行运算后用数码管显示出PWM低通后输出的电压大小。 定时器2是一个8位定时器,因此输出的PWM波的位数最高只有8位,因此DAC的分辨率也只有8位,可能感觉不够。实际使用中,应该使用

5、定时器1的PWM端口比较好,因为定时器1有16位之多,实现DAC可以有10位精度。 三、 硬件连接 连接PC07的数码管接口,连接PD7和P 7的左边2脚,如图。 连接AREF的跳线帽,还要拔掉PA7的流水灯跳线帽: 华南理工大学无线电爱好者协会 AVR-R&D V2.1 QQ群:63191815 Editor:*轩辕十四* Created date:2010-2-9 - 3 - 四、 实验代码 / 必须包含这2个必要的头文件 #include #include /*数码管接口定义*/ / 定义接口 #define SCK PC7 #define RCK PC6 #define OE PC5

6、#define SER PC4 #define SMG3 PC3 #define SMG2 PC2 #define SMG1 PC1 #define SMG0 PC0 #define IO_DDR DDRC #define IO_PORT PORTC / 定义接口的高、低电平 #define SCK_H IO_PORT|=1SCK #define SCK_L IO_PORT&=(1SCK) #define RCK_H IO_PORT|=1RCK #define RCK_L IO_PORT&=(1RCK) #define OE_H IO_PORT|=1OE #define OE_L IO_POR

7、T&=(1OE) #define SER_H IO_PORT|=1SER #define SER_L IO_PORT&=(1SER) #define SMG3_H IO_PORT|=1SMG3 #define SMG3_L IO_PORT&=(1SMG3) 华南理工大学无线电爱好者协会 AVR-R&D V2.1 QQ群:63191815 Editor:*轩辕十四* Created date:2010-2-9 - 4 - #define SMG2_H IO_PORT|=1SMG2 #define SMG2_L IO_PORT&=(1SMG2) #define SMG1_H IO_PORT|=1S

8、MG1 #define SMG1_L IO_PORT&=(1SMG1) #define SMG0_H IO_PORT|=1SMG0 #define SMG0_L IO_PORT&=(1SMG0) /*端口说明及宏定义*/ /PB为键盘所在端口 #define key_DDR DDRB #define key_PORT PORTB #define key_PIN PINB / ADC7 #define AD_CH_V 7 /*/ /*将两个pragma中间的数据放到程序寄存器中 即放到flash中*/ /* 以免占用内存 即sram的空间 */ #pragma data:code const u

9、nsigned char table=0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6, / 数字字模 0x01;/ 小数点位 #pragma data:data /*/ void delay_ms(unsigned int t) / 毫秒级延时函数 while(t-) delay_us(1000); / 执行时间大约1ms void delay_us(unsigned int t) / 微秒级延时函数 while(t-) / 执行一周大约1us asm(nop); / 嵌入汇编,表示空操作, asm(nop); / 不执行任何指令,消耗时间,

10、 asm(nop); / 起到延时的作用 asm(nop); asm(nop); asm(nop); asm(nop); / 系统初始化 void System_Init() IO_DDR=0xff; / 显示函数 void show(unsigned int data) unsigned char temp; unsigned char num; unsigned char i=0; 华南理工大学无线电爱好者协会 AVR-R&D V2.1 QQ群:63191815 Editor:*轩辕十四* Created date:2010-2-9 - 5 - for(i=0;i4;i+) SMG0_L;

11、SMG1_L;SMG2_L;SMG3_L; / 关闭所有位选 switch(i) case 0: / 取出data的千位的数字,并位选 num=data/1000; SMG0_H; break; case 1: / 取出百位 num=data/100%10; SMG1_H; break; case 2: / 取出十位 num=data/10%10; SMG2_H; break; case 3: / 取出个位 num=data%10; SMG3_H; break; default:break; num=tablenum; if(!i)num+; / 添加千位的小数点 for(temp=0;tem

12、p8;temp+) / 共移入8位数据,恰好驱动数码管 if(num&(1temp) / num对应字模,temp对应第temp位 SER_H; / 根据字模的1置位数据端 else SER_L; / 字模的0置零数据端 SCK_H; SCK_L; / 高电平脉冲,上升沿数据移入 RCK_H; RCK_L; / 高电平脉冲,数据输出 OE_L; / 使能输出端口 delay_ms(1);/ 显示时间2ms OE_H; / 关闭显示,如果不关闭,显示数码间有重影 / ADC初始化 void ADC_Init() ADMUX =0x40; / AVCC参考、右对齐、ADC0通道 ADCSRA=0x

13、C6; / 使能ADC、单次模式、启动第一次、12MHz内部时钟64分频 while(ADCSRA & (1ADSC); / 等待采样结束,第一次转换 / 启动一次采样,获取ADC数据 unsigned int get_ad_data(unsigned char AD_CH) ADMUX=(0xC0|AD_CH); / 配置通道 ADCSRA|=1ADSC; / 启动一次转换 华南理工大学无线电爱好者协会 AVR-R&D V2.1 QQ群:63191815 Editor:*轩辕十四* Created date:2010-2-9 - 6 - while(ADCSRA & (1ADSC); / 等待采样结束 return( (ADCH8)|ADCL ); / 返回转换结果,注意,左右对齐,对应移位方法不同 / PWM初始化配置 void PWM_DAC_Init() DDRD=BIT(7); TCCR2=0x6a; / 8位快速PWM模式,时钟8分频,PWM

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 中学教育 > 教学课件 > 高中课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号