练习三 ADDA的使用与调试报告苑振涛组.docx
- 文档编号:30641065
- 上传时间:2023-08-18
- 格式:DOCX
- 页数:27
- 大小:647.28KB
练习三 ADDA的使用与调试报告苑振涛组.docx
《练习三 ADDA的使用与调试报告苑振涛组.docx》由会员分享,可在线阅读,更多相关《练习三 ADDA的使用与调试报告苑振涛组.docx(27页珍藏版)》请在冰豆网上搜索。
练习三ADDA的使用与调试报告苑振涛组
练习三A/D、D/A的使用与调试报告
苑振涛张博晨闫陶
2011年7月21日
摘要
本设计基于EasyCortexM3-1752系统为核心,主要运用了系统内部A/D、D/A芯片,显示部分采用了12864点阵液晶显示模块。
本系统通过内部A/D、D/A芯片的调用实现直流电压和正弦波的幅值及频率的识别与稳定输出。
目录
一.设计要求与任务(系统设计)4
二.总体方案及论证(系统设计)4
三.系统硬件设计(单元设计)4
四.系统测试与测试结果8
五.结论10
六.参考资料11
附录11
一.设计要求与任务(系统设计)
利用常用A/D、D/A与MCU系统连接及使用(数据采集、显示)
二.总体方案及论证(系统设计)
本设计使用了EasyCortexM3-1752系统为核心,运用了系统内部A/D、D/A芯片,显示部分采用了12864点阵液晶显示模块。
除此之外,本设计还包括了峰值检波电路。
系统方框图
三.系统硬件设计(单元设计)
主控部分
LPC1700系列ARM是基于第二代ARMCortex-M3内核的微控制器,是为嵌入式系统应用而设计的高性能、低功耗的32位微处理器,适用于仪器仪表、工业通讯、电机控制、灯光控制、报警系统等领域。
其操作频率高达120MHz,采用3级流水线和哈佛结构,带独立的本地指令和数据总线以及用于外设的低性能的第三条总线,使得代码执行速度高达1.25MIPS/MHz,并包含1个支持随机跳转的内部预取指单元。
LPC1700系列ARM增加了一个专用的Flash存储器加速模块,使得在Flash中运行代码能够达到较理想的性能。
最高配置包括512KB片内Flash程序存储器、96KB片内SRAM、4KB片内EEPROM、8通道GPDMA控制器、4个32位通用定时器、一个8通道12位ADC、1个10位DAC、1路电机控制PWM输出(MCPWM)、1个正交编码器接口、6路通用PWM输出、1个看门狗定时器以及一个独立供电的超低功耗RTC。
ADC部分
A/D转换器的基本时钟由APB时钟提供。
A/D转换器包含一个可编程的分频器,它可以将APB时钟调整为主次逼近转换所需的时钟(最大可达13Mhz)。
并且,完全满足精度要求的转换需要65个这样的时钟。
具有掉电模式,测量范围:
0~VREFP(通常为3V;不超过VDDA),12位转换时间为200KHz。
一个或多个输入的Burst转换模式,可选择由输入跳变或定时器匹配信号触发转换。
使用以下寄存器来配置ADC:
1)功率:
在寄存器PCONP中置位PCADC。
注:
复位后,ADC被禁能。
若要使能ADC,首先将位PCADC置位然后使能寄存器AD0CR中的ADC(即位PDN,见表29.3)。
若要禁能ADC,必须先将位PDN清零,再将位PCADC清零。
2)时钟:
在寄存器PCLK_SEL0中选择PCLK_ADC,若要调节ADC的时钟频率,请参见表29.3中关于位CLKDIV的描述。
3)引脚:
通过寄存器PINSEL来使能ADC0引脚。
通过寄存器PINMODE来选择带ADC功能的引脚的模式(请参考“引脚连接模块”章节的“寄存器描述”小节)。
4)中断:
若要使能ADC中断,请参见表29.7。
利用相应的中断置位使能寄存器使能NVIC中的ADC中断或禁止ADC中断。
DAC部分
使用以下寄存器来配置DAC:
1)电源:
DAC的电源总是开启的。
2)时钟:
在寄存器PCLK_SEL0中选择PCLK_DAC。
3)引脚:
通过寄存器PINSEL来使能DAC引脚。
通过寄存器PINMODE来选择带DAC功能的引脚的模式(请见“引脚连接模块”章节的“寄存器描述”小节),必须在访问DAC寄存器之前选择好引脚的模式。
4)DMA:
DAC可以连接到GPDMA控制器(请见“DMA控制”小节)。
下表对每个DAC相关的引脚进行了简要总结。
D/A引脚描述引脚
类型
描述
AOUT
输出
模拟输出。
当DACR写入新值后,经过所选的设定时间,该引脚的电压为VALUE/1024×VREF(相对于VSSA)
VREF
参考
参考电压。
该引脚为D/A转换器提供参考电压
VDDA
VSSA
电源
模拟电源和地。
它们应当分别与VDD(3V3)和VSS的电压相同,但为了降低噪声和出错几率,两者应当隔离
峰值滤波部分
电路原理图
实物电路图
四.系统测试与测试结果
实物连接图
正弦波形识别显示
输出波形
直流显示
直流输出
五.结论
本设计可识别输入电压范围为0-3V,可识别频率范围为0-7MHz;输出电压范围为0-3V,输出频率范围为0-3.5K,基本满足题目要求。
原有设计中的检波部分功能尚未实现。
六.参考资料
附录
主程序
#include"..\config.h"
/*********************************************************************************************************
宏定义
*********************************************************************************************************/
#defineucharunsignedchar
#defineuintunsignedint
ucharGain=0,lcdflg=0,adflg=0,wavecount=0;
INT32Ucount,pkp;
#defineinitdata0x00b4
#definevarydata0x0022
#defineKEY1(1ul<<10)/*P2.10连接KEY1*/
#defineKEY2(1ul<<0)/*P2.10连接KEY1*/
#defineKEY3(1ul<<1)/*P2.10连接KEY1*/
#defineKEY4(1ul<<4)/*P2.10连接KEY1*/
#defineBIT(x)(1<<(x))
////**************12864端口定义及控制
#defineCS0//P0.0RS
#defineSID1//P0.1RW
#defineSCLK2//P0.2E
#defineSet_CS()FIO0SET|=BIT(0);//P0.0置1
#defineSet_SID()FIO0SET|=BIT
(1);//P0.1置1
#defineSet_SCLK()FIO0SET|=BIT
(2);//P0.2置1
#defineClr_CS()FIO0CLR|=BIT(0);//P0.0置0
#defineClr_SID()FIO0CLR|=BIT
(1);//P0.1置0
#defineClr_SCLK()FIO0CLR|=BIT
(2);//P0.2置0
charinit1[]={"基于:
LPC175x"};
charinit2[]={"LCD测试"};
charinit3[]={"峰值:
"};
charinit4[]={"频率:
"};
charinit8[]={0,0,0,0,0,0,0};
charinit9[]={"Hz"};
charinit10[]={"mv"};
INT16Uconstsin_tab[250]={
//输出电压从0到最大值(正弦波1/4部分)
0x80,0x83,0x86,0x89,0x8d,0x90,0x93,0x96,0x99,0x9c,0x9f,0xa2,0xa5,0xa8,0xab,0xae,0xb1,0xb4,0xb7,0xba,0xbc,
0xbf,0xc2,0xc5,0xc7,0xca,0xcc,0xcf,0xd1,0xd4,0xd6,0xd8,0xda,0xdd,0xdf,0xe1,0xe3,0xe5,0xe7,0xe9,0xea,0xec,
0xee,0xef,0xf1,0xf2,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,0xfd,0xfe,0xff,0xff,0xff,
//输出电压从最大值到0(正弦波1/4部分)
0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfd,0xfd,0xfc,0xfb,0xfa,0xf9,0xf8,0xf7,0xf6,0xf5,0xf4,0xf2,0xf1,0xef,
0xee,0xec,0xea,0xe9,0xe7,0xe5,0xe3,0xe1,0xde,0xdd,0xda,0xd8,0xd6,0xd4,0xd1,0xcf,0xcc,0xca,0xc7,0xc5,0xc2,
0xbf,0xbc,0xba,0xb7,0xb4,0xb1,0xae,0xab,0xa8,0xa5,0xa2,0x9f,0x9c,0x99,0x96,0x93,0x90,0x8d,0x89,0x86,0x83,0x80,
//输出电压从0到最小值(正弦波1/4部分)
0x80,0x7c,0x79,0x76,0x72,0x6f,0x6c,0x69,0x66,0x63,0x60,0x5d,0x5a,0x57,0x55,0x51,0x4e,0x4c,0x48,0x45,0x43,
0x40,0x3d,0x3a,0x38,0x35,0x33,0x30,0x2e,0x2b,0x29,0x27,0x25,0x22,0x20,0x1e,0x1c,0x1a,0x18,0x16,0x15,0x13,
0x11,0x10,0x0e,0x0d,0x0b,0x0a,0x09,0x08,0x07,0x06,0x05,0x04,0x03,0x02,0x02,0x01,0x00,0x00,0x00,
//输出电压从最小值到0(正弦波1/4部分)
0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0d,0x0e,0x10,
0x11,0x13,0x15,0x16,0x18,0x1a,0x1c,0x1e,0x20,0x22,0x25,0x27,0x29,0x2b,0x2e,0x30,0x33,0x35,0x38,0x3a,0x3d,
0x40,0x43,0x45,0x48,0x4c,0x4e,0x51,0x55,0x57,0x5a,0x5d,0x60,0x63,0x66,0x69,0x6c,0x6f,0x72,0x76,0x79,0x7c,0x80};
//*****************12864函数声明
voidnop(void);
voidDelay(uinta);//延时子程序
voidLcd_WriteDat(charRW,charRS,ucharW_data);
voidLcd_WriteCmd(uintW_bits);
voidLCD_Init(void);
voidLcd_DispLine(uchary,ucharx,char*p);
voidDIP_Init(void);
//*********************************************************************************************************
//**Functionname:
Delay()延时ms
//**Functionname:
nop()延时us
//*********************************************************************************************************/
__inlinevoidDelay(uinta)
{
uinti;
while(--a!
=0)
{for(i=0;i<5200;i++);}
}
voidnop()
{
uinti;
for(i=1;i<12;i++);
}
//************************************************************************************************************
//////////////////12864控制程序///////////////////
//************************************************************************************************************/
voidLCD_Init(void)
{
ucharcmd;
cmd=0x30;//功能设置8位数据,基本指令
Lcd_WriteDat(0,0,cmd);
Delay
(2);
cmd=0x0C;//显示状态ON,游标OFF,反白OFF
Lcd_WriteDat(0,0,cmd);//写指令
Delay
(2);
cmd=0x01;//清除显示
Lcd_WriteDat(0,0,cmd);//写指令
Delay
(2);
cmd=0x02;//地址归位
Lcd_WriteDat(0,0,cmd);//写指令
Delay
(2);
cmd=0x80;//设置DDRAM地址
Lcd_WriteDat(0,0,cmd);//写指令
Delay
(2);//延时
}
voidLcd_WriteDat(charRW,charRS,ucharW_data)//xieshuju函数作用:
写一个字节的数据到12864液晶,包括指令和数据
{
uintH_data,L_data,S_ID=0xf8;//11111RWRS0
if(RW==0)
{S_ID&=~0x04;}
else//if(RW==1)
{S_ID|=0X04;}
if(RS==0)
{S_ID&=~0x02;}
else//if(RS==1)
{S_ID|=0X02;}
H_data=W_data;
H_data&=0xf0;//屏蔽低4位的数据
L_data=W_data;//xxxx0000格式
L_data&=0x0f;//屏蔽高4位的数据
L_data<<=4;//xxxx0000格式
Set_CS();
Lcd_WriteCmd(S_ID);//发送S_ID
Lcd_WriteCmd(H_data);//发送H_data
Lcd_WriteCmd(L_data);//发送L_data
Clr_CS();
}
voidLcd_WriteCmd(uintW_bits)//函数作用:
负责串行输出8个bit位xiedizhi
{
uinti,Temp_data;
for(i=0;i<8;i++)
{
Temp_data=W_bits;
Temp_data<<=i;
if((Temp_data&0x80)==0)
{Clr_SID();}
else
{Set_SID();}
nop();
Set_SCLK();
nop();
nop();
Clr_SCLK();
nop();
Clr_SID();
}
}
voidLcd_SetPos(uchary,ucharx)//设置写入位置
{
if(y==0)
{Lcd_WriteDat(0,0,(0x80+x));}
if(y==1)
{Lcd_WriteDat(0,0,(0x90+x));}
if(y==2)
{Lcd_WriteDat(0,0,(0x88+x));}
if(y==3)
{Lcd_WriteDat(0,0,(0x98+x));}
}
voidLcd_DispLine(uchary,ucharx,char*p)//函数作用:
写入字符串
{
Lcd_SetPos(y,x);
while(*p!
=0)
{Lcd_WriteDat(0,1,*p++);//利用指针调用数组里的数据
Delay
(1);}
}
voidDIP_Init(void)//显示
{
Lcd_DispLine(0,0,init1);//第一行
Lcd_DispLine(1,0,init2);//第二行
Lcd_DispLine(2,0,init3);
Lcd_DispLine(3,0,init4);
}
/*********************************************************************************************************
**Functionname:
myDelay
**Descriptions:
软件延时
**inputparameters:
ulTime
**outputparameters:
无
**Returnedvalue:
无
*********************************************************************************************************/
voidmyDelay(INT32UulTime)
{
INT32Ui;
i=0;
while(ulTime--){
for(i=0;i<5000;i++);
}
}
/*********************************************************************************************************
*Functionname:
adcInit
*Descriptions:
ADC初始化,转换时钟为13MHz,突发模式
*inputparameters:
无
*outputparameters:
无
*Returnedvalue:
无
*********************************************************************************************************/
voidadcInit(void)
{
INT32UulTemp;
PCONP|=1<<12;/*打开ADC的功率控制位*/
ulTemp=(24000000/(13000000));
ulTemp=(1<<2)/*选择AD0.2为AD输入引脚*/
|((ulTemp)<<8)/*转换时钟为13MHz*/
|(1<<16)/*BURST=1,使用Burst模式,*/
/*让硬件不断地进行转换*/
|(0<<17)/*CLKS=0,使用11clock转换*/
|(1<<21)/*PDN=1,正常工作模式*/
|(0<<24);/*START=0,在Burst模式下,*/
/*起始位(bit24~26)必须为0*/
AD0CR=ulTemp;
}
/*********************************************************************************************************
*FunctionName:
timer0Isr
*Description:
TIMER0中断处理函数
*Input:
无
*Output:
无
*Return:
无
*********************************************************************************************************/
voidtimer0Isr(void)
{
T0IR=0x01;/*清除中断标志*/
if(count==0)
{
DACR=((pkp/2*1024/3000)<<6);
}
else{
//DACR=((4*sin_tab[wavecount++]*pkp/3000)<<6);
DACR=((4*sin_tab[wavecount++])<<6);
if(wavecount>=250)
wavecount=0;
}
}
/*********************************************************************************************************
*FunctionName:
timer2Isr
*Description:
TIMER2中断处理函数
*Input:
无
*Output:
无
*Return:
无
*********************************************************************************************************/
voidtimer3Isr(void)
{
T3IR=0x01;/*清除中断标志*/
count=T1TC;
T1TC=0;
lcdflg=1;
adflg=1;
T0TCR=0x02;
if(count!
=0)
T0MR0=FPCLK/250/count;
else
T0MR0=FPCLK/250;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 练习三 ADDA的使用与调试报告苑振涛组 练习 ADDA 使用 调试 报告 苑振涛组