资源描述
目 录
1 课程设计目的 1
2 课程设计正文 1
2.1系统分析 1
2.1.1 设计的任务及环节 1
2.1.2 技术规定 2
2.1.3设计思绪 2
2.2 总体设计 2
2.2.1硬件设计 2
2.2.2 系统框图设计 3
2.3 元器件的选择 3
2.3.1 单元电路设计 3
2.3.2 单元模块分析 4
2.4 程序流程图与源程序 5
2.4.1 软件系统流程图 5
3 运营结果 5
4 课程设计总结 6
5 参考文献 7
附录 7
1 课程设计目的
通过我们对DSP控制器及其应用课程的学习和理解,综合运用课本中所学到的理论知识完毕一个温度采集与显示的课程设计。通过这次实践锻炼我们查阅资料、方案比较、团结合作的能力。在这个过程我们必须掌握温度采集技术的硬件设计、熟悉A/D转换技术和DSP液晶显示功能的软件设计。学会采用简朴电路的实验调试和整机指标测试方法,增强我们的动手能力,为以后学习和工作打下坚实基础。
2 课程设计正文
2.1系统分析
2.1.1 设计的任务及环节
(1)熟悉MC1403(低压基准芯片)芯片的应用;
(2)根据实验测得热敏电阻和温度的一些数据,设计温度——电阻公式;
(3)设计外部硬件电路;
(4)软件完毕程序流程图设计和编程,其中涉及A/D转换和液晶显示部分;
(5)软硬件联合调试;
(6)书写设计说明书。
2.1.2 技术规定
此系统运用热敏电阻测得电阻—温度之间的关系,找到电阻和温度之间的代数关系,从而检测温度,设计硬件外扩电路,同时设计软件程序,涉及A/D程序设计,进行软硬件联系调试,能在液晶显示屏上显示温度。
2.1.3设计思绪
系统一方面设计温度采集硬件电路,在多次实验运算拟合出热敏电阻输出电压值与温度之间的函数关系,热敏电阻的输出的电压值随温度的上升而下降,呈现出负系数,从而运用于实验中检测温度;然后将采集的温度送入DSP TMS320F2812模数转换模块将电压信号变为数字信号,再编写函数来控制LCD来显示相应的温度及相关文字。
2.2 总体设计
2.2.1硬件设计
TMS320F2812作为使用的DSP芯片。它包含33个电源引脚(为使器件正常运营,所有电源引脚必须对的连接且不能悬空)时钟源模块,DSP有六种信号可以使DSP控制器复位,即电源复位、复位引脚~RS、软件复位、非法地址复位、看门狗定期器溢出、欠压复位六种复位信号。所以在设计的初期,把它提成了五个模块。其中复位采用电源复位的方式,由引脚PCRESET引起。为了可靠复位,其中低电平的有效时间至少6个CPU时钟周期。DSP最小系统组成框图如图1所示。
图1 DSP最小系统
其中:开关SW-PB、电容C1、两个反相器及其电阻电源构成了复位电路,晶振与两个并联电容接XTAL1与XTAL2构成振荡电路,PWM1与PWM7构成了调制信号的输入与输出,旁路引脚接地,请求控制信号MP/MC与GND接地。
2.2.2 系统框图设计
该系统涉及温度采集电路模块、DSPF2812芯片、A/D转换部分和LCD液晶显示,一方面要初始化A/D转换模块,然后等待中断,当产生中断后对采集到的模拟信号进行解决,为保证转换精度要进行多次取值求平均,转换结果放在结果寄存器的高12位上,通过编程将解决后的温度值送到LCD上进行显示。
温度采集电路
DSPF2812
A/D转换电路
液晶显示模块
图2 系统设计流程图
2.3 元器件的选择
2.3.1 单元电路设计
(1)设计方案
MC1403芯片为数模转换提供基准电压,且输入端接+5V电源后再并联一个去噪声的电容,运用热敏电阻进行温度采集,采集后的输出电压(不得大于3.3v)与DSP的P2端口23引脚相连。
(2)外扩电路设计图
图3 温度采集电路原理图
2.3.2 单元模块分析
(1)MC1403芯片的引脚结构如下图所示。
图4 MC1403芯片
Vin端口输入一个4.5~5.0V的模拟电压值(接P2口的1引脚),在输入端接一个电容滤除其他频率分量,在Vout端输出了一个稳定的电压值(接P2口的23引脚),该电压值不得大于3.3V,GND端接模拟地(接P2口的33引脚)。
(2) A/D转换模块
当模/数转换完毕后,读取结果寄存器前,最佳先读取模/数转换控制寄存器ADCRL2的ADCFIF01或ADCFIF02,以拟定当前结果寄存器的状态,保证读取的结果是对的。此外,要注意12位的转换结果放在结果寄存器中的高12位上,该12位数据与外部模拟输入电压的关系为:
12位数字结果=4095*(输入电压/基准电压)
2.4 程序流程图与源程序
2.4.1 软件系统流程图
软件系统流程图如图5所示。
开 始
初始化DSP时钟
初始化CTR
初始化AD采样时钟
中断采集数据存入Voltagel中
数据解决后的温度值送到LCD显示
清楚并显示相关文字
启动AD0通道采集
图5 程序流程图
3 运营结果
(1)运营描述
M1403芯片作为模数转换提供基准电压,运用热敏电阻进行采集,采集后的输出电压与DSP的P2口23引脚相连。将采集到的电压送入A/D转换模块,编写程序实现A/D转换,转换结果放在结果寄存器的高12位上,编写函数获取A/D转换结果,将解决的温度值的各个相应显示到LCD上。
(2)系统调试
MC1403 芯片Vin 端输入一个+5V的模拟电压值;在输入端接一个电容滤除其它频率分量;在 Vout 端输出了一个稳定的电压值;GND端直接接模拟地;给实验箱供电,打开 Setup CCS2(‘C2023), 在弹出的对话框中选择ICETEK-5100 USB Emulator for TMS320F2812 导入,进行配置设立然后进入 CCS2(‘C2023),打开工程文献进行编译生成 .out 文献下载到硬盘中然后调试,观测液晶显示屏,第一行显示“温度显示”,第二行显示“ 温度值 ℃”,当用手触摸时,温度显示不断变化,实现了温度的采集与现实。
4 课程设计总结
通过学习DSP课程我们都知道,DSP事实上也是一种单片机,它同样是将中央解决单元、控制单元和外围设备集成到一块芯片上。但DSP有别于普通的单片机,它采用了多组总线技术实现并行运营机制,从而极大地提高了运算速度,也提供了非常灵活的指令系统。
通过这次课程设计,不仅是我进一步加深对课本知识的理解,更让我学会了团结合作的精神,不仅锻炼了我们动手动脑的能力,还提高了我们分析问题、解决问题的能力,在这次设计中我也学会了遇事要冷静,团结合作,虚心请教,没有任何事情解决不了,最后衷心的感谢始终支持我们的老师们,你们辛劳了!
5 参考文献
[1] 万山明.TMS320F281x DSP原理及应用实例.北京航空航天大学出版社,2023
[2] 郑红,王鹏,董云凤,吴冠.DSP应用系统设计实践.北京航空航天大学出版社,2023
[3] 徐科军,张瀚,陈智渊.TMS320F281xDSP 原理与应用.北京航空航天大学出版社,2023
附录
#include "DSP281x_Device.h" // DSP281x Headerfile Include File
#include "DSP281x_Examples.h" // DSP281x Examples Include File
// Prototype statements for functions found within this file.
interrupt void adc_isr(void);
// Global variables used in this example:
#define LCDDELAY 1
#define LCDCMDTURNON 0x3f
#define LCDCMDTURNOFF 0x3e
#define LCDCMDSTARTLINE 0xc0
#define LCDCMDPAGE 0xb8
#define LCDCMDVERADDRESS 0x40
#define ADC_usDELAY 8000L
#define ADC_usDELAY2 20L
Uint16 ZhengshuT,XiaoshuT,Zhongjian1,Zhongjian2;
float temp1=0;
unsigned char lcdkey[5][32];
unsigned char ledkey[12][8];
Uint16 LoopCount;
Uint16 ConversionCount;
float temp;
Uint16 i,j;
Uint16 Voltage1[1024];
Uint16 Voltage2[1024];
void Delay(int nDelay);
void TurnOnLCD();
void LCDCLS();
void LCDWrite(unsigned int x,unsigned int y,unsigned int LR,unsigned int n);
void main(void)
{
InitSysCtrl();
EALLOW;
GpioMuxRegs.GPFMUX.all=0x0000; //I/O:0 特殊功能:1
GpioMuxRegs.GPFDIR.all=0x000f; // output
EDIS;
DINT;
InitPieCtrl();
IER = 0x0000; //CPU中断允许寄存器
IFR = 0x0000;//CPU中断标志寄存器
InitPieVectTable();
EALLOW;
SysCtrlRegs.HISPCP.all = 0x3; // HSPCLK = SYSCLKOUT/6给AD转换时钟提供一个6分频
EDIS;
EALLOW; // This is needed to write to EALLOW protected register
PieVectTable.ADCINT = &adc_isr;
EDIS; // This is needed to disable write to EALLOW protected registers
InitAdc(); // 初始化AD
PieCtrlRegs.PIEIER1.bit.INTx6 = 1;
IER |= M_INT1; // Enable CPU Interrupt 1
EINT; // Enable Global interrupt INTM
ERTM; // Enable Global realtime interrupt DBGM
LoopCount = 0;
ConversionCount = 0;
// Configure ADC
AdcRegs.ADCMAXCONV.all = 0x0001; // Setup 2 conv's on SEQ1
AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x0; // Setup ADCINA3 as 1st SEQ1 conv.
AdcRegs.ADCCHSELSEQ1.bit.CONV01 = 0x1; // Setup ADCINA2 as 2nd SEQ1 conv.
AdcRegs.ADCTRL2.bit.EVA_SOC_SEQ1 = 1; // Enable EVASOC to start SEQ1
AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1 = 1; // Enable SEQ1 interrupt (every EOS)
// Configure EVA
// Assumes EVA Clock is already enabled in InitSysCtrl();
EvaRegs.T1CMPR = 0x0080; // Setup T1 compare value
EvaRegs.T1PR = 0x0fff; // Setup period register
EvaRegs.GPTCONA.bit.T1TOADC = 1; // Enable EVASOC in EVA
EvaRegs.T1CON.all = 0x1042; // Enable timer 1 compare (up
TurnOnLCD(); //打开显示
LCDCLS(); //清除显示内存
*(int *)0x108000=0x80; // 初始化ICETEK-CTR
Delay(LCDDELAY);
*(int *)0x108000=0x0;
Delay(LCDDELAY);
*(int *)0x108000=0x80;
Delay(LCDDELAY);
*(int *)0x108001=LCDCMDSTARTLINE; // 设立显示起始行
Delay(LCDDELAY);
*(int *)0x108002=0;
Delay(LCDDELAY);
for(;;)
{
Wendu(temp);
LCDWrite(2,0,0,0);
LCDWrite(2,16,0,1);
LCDWrite(2,32,1,2);
LCDWrite(2,48,1,3);
LCDWrite(6,48,1,4);//在液晶屏上显示相应的汉字及符号
WriteNb(6,6,ledkey[ZhengshuT&0x000f],0,0);
WriteNb(6,5,ledkey[(ZhengshuT&0x00f0)>>4],0,0);
WriteNb(6,2,ledkey[XiaoshuT&0x000f],0,1);
WriteNb(6,1,ledkey[(XiaoshuT&0x00f0)>>4],0,1);
WriteNb(6,7,ledkey[11],0,0);//在液晶屏上显示温度值
}
}
void Delay( int nDelay)
{
int ii,jj,kk=0;
for ( ii=0;ii<nDelay;ii++ )
{
for ( jj=0;jj<1024;jj++ )
{
kk++;
}
}
}
//打开显示子程序
void LCDCLS()
{
int i,j;
*(int *)0x108001=LCDCMDSTARTLINE;
Delay(LCDDELAY);
*(int *)0x108002=0;
Delay(LCDDELAY);
for ( i=0;i<8;i++ )
{
*(int *)0x108001=LCDCMDPAGE+i;
Delay(LCDDELAY);
*(int *)0x108002=0;
Delay(LCDDELAY);
*(int *)0x108001=LCDCMDVERADDRESS;
Delay(LCDDELAY);
*(int *)0x108002=0;
Delay(LCDDELAY);
for ( j=0;j<64;j++ )
{
*(int *)0x108003=0;
Delay(LCDDELAY);
*(int *)0x108002=0;
Delay(LCDDELAY);
}
*(int *)0x108001=LCDCMDPAGE+i;
Delay(LCDDELAY);
*(int *)0x108002=0;
Delay(LCDDELAY);
*(int *)0x108001=LCDCMDVERADDRESS;
Delay(LCDDELAY);
*(int *)0x108002=0;
Delay(LCDDELAY);
for ( j=0;j<64;j++ )
{
*(int *)0x108004=0;
Delay(LCDDELAY);
*(int *)0x108002=0;
Delay(LCDDELAY);
}
}
}
if(LR==0)
{
int j;
int k=n;
*(int *)0x108001=LCDCMDPAGE+x;
Delay(1);
*(int *)0x108002=0;
Delay(1);
*(int *)0x108001=LCDCMDVERADDRESS+y;
Delay(1);
*(int *)0x108002=0;
Delay(1);
for(j=0;j<16;j++)
{
*(int *)0x108003=lcdkey[k][j];
Delay(10);
*(int *)0x108002=0;
Delay(1);
for(j=16;j<32;j++)
{
*(int *)0x108003=lcdkey[k][j];
Delay(100);
*(int *)0x108002=0;
Delay(100);
}
}
else
{
int j;
int k=n;
*(int *)0x108002=0;
Delay(1);
*(int *)0x108001=LCDCMDVERADDRESS+y;
Delay(1);
for(j=0;j<16;j++)
{
*(int *)0x108004=lcdkey[k][j];
Delay(100);
*(int *)0x108002=0;
Delay(100);
}
Delay(100);
}
}
}
void WriteNb(unsigned int x,unsigned int y,unsigned char *No,unsigned f,unsigned int LR)
{
int i;
y*=8;
*(int *)0x108001=LCDCMDPAGE+x; // 设立操作页=1
Delay(LCDDELAY);
*(int *)0x108002=0;
Delay(LCDDELAY);
*(int *)0x108001=LCDCMDVERADDRESS+y; // 起始列=8
Delay(LCDDELAY);
*(int *)0x108002=0;
Delay(LCDDELAY);
if(f==1)
*(int*)0x108003=~No[i];
else
*(int*)0x108003=No[i];
Delay(LCDDELAY);
*(int*)0x108002=0;
Delay(LCDDELAY);
}
}
展开阅读全文