當(dāng)前位置: 首頁 > 傳感測量產(chǎn)品 > 工業(yè)傳感器 > 溫度傳感器
發(fā)布日期:2022-10-09 點(diǎn)擊率:143
1、打開電腦的“控制面板” -->“字體”,把“數(shù)碼管字體”文件夾中的兩個(gè)文件,復(fù)制到“字體”中
2、重新打開main.vi,就可以在您的字體設(shè)置欄找到NI7SEG字體了
3、本labview采集程序采用了自動(dòng)識別單片機(jī)串口技術(shù),用戶不必手動(dòng)選擇串口
4、本程序可以測量STM32芯片內(nèi)部的溫度。如果您用手按住開發(fā)板上的STM32芯片,可以看到labview上顯示的溫度在增加
5、本實(shí)驗(yàn)的采樣率是:10/秒,即labview可以在100ms之內(nèi)處理完一個(gè)數(shù)據(jù)。如果用戶的采樣率加大,請采用labview生產(chǎn)者/消費(fèi)者結(jié)構(gòu)
單片機(jī)源程序如下:
#include "stm32f10x.h"
#include
RCC_HCLKConfig(RCC_SYSCLK_Div1); //配置AHB(HCLK)時(shí)鐘等于==SYSCLK
RCC_PCLK2Config(RCC_HCLK_Div1); //配置APB2(PCLK2)鐘==AHB時(shí)鐘
RCC_PCLK1Config(RCC_HCLK_Div2); //配置APB1(PCLK1)鐘==AHB1/2時(shí)鐘
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); //配置PLL時(shí)鐘==外部高速晶體時(shí)鐘 * 9=72MHz
RCC_PLLCmd(ENABLE); //使能PLL時(shí)鐘
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET) //等待PLL時(shí)鐘就緒
{
}
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); //配置系統(tǒng)時(shí)鐘=PLL時(shí)鐘
while(RCC_GetSYSCLKSource() !=0x08) //檢查PLL時(shí)鐘是否作為系統(tǒng)時(shí)鐘
{
}
}
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOF | RCC_APB2Periph_AFIO, ENABLE); //允許GPIOB、GPIOF、AFIO時(shí)鐘
}
static void ADC_Configuration(void)
{
ADC_InitTypeDef ADC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
RCC_ADCCLKConfig(RCC_PCLK2_Div6); //72M/6=12,ADC最大時(shí)間不能超過14M
ADC_InitStructure.ADC_Mode=ADC_Mode_Independent; //ADC1工作模式:獨(dú)立模式
ADC_InitStructure.ADC_ScanConvMode=DISABLE; //單通道模式
ADC_InitStructure.ADC_ContinuousConvMode=DISABLE; //單次轉(zhuǎn)換
ADC_InitStructure.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None; //轉(zhuǎn)換由軟件而不是外部觸發(fā)啟動(dòng)
ADC_InitStructure.ADC_DataAlign=ADC_DataAlign_Right; //ADC1數(shù)據(jù)右對齊
ADC_InitStructure.ADC_NbrOfChannel=1; //順序進(jìn)行規(guī)則轉(zhuǎn)換的ADC通道的數(shù)目
ADC_Init(ADC1, &ADC_InitStructure); //根據(jù)ADC_InitStruct中指定的參數(shù),初始化外設(shè)ADC1的寄存器
ADC_RegularChannelConfig(ADC1, ADC_Channel_16, 1, ADC_SampleTime_55Cycles5); //ADC1,ADC通道16,規(guī)則采樣順序值為1,采樣時(shí)間為55.5周期
ADC_TempSensorVrefintCmd(ENABLE); //ADC內(nèi)置溫度傳感器使能(要使用片內(nèi)溫度傳感器,切記要開啟它)
ADC_Cmd(ADC1, ENABLE); //使能ADC1
ADC_ResetCalibration(ADC1); //重置ADC1的校準(zhǔn)寄存器
while(ADC_GetResetCalibrationStatus(ADC1)); //獲取ADC1重置校準(zhǔn)寄存器的狀態(tài),設(shè)置狀態(tài)則等待
ADC_StartCalibration(ADC1); //開始ADC1的校準(zhǔn)狀態(tài)
while(ADC_GetCalibrationStatus(ADC1)); //等待校準(zhǔn)完成
ADC_SoftwareStartConvCmd(ADC1, ENABLE); //使能ADC1的軟件轉(zhuǎn)換啟動(dòng)功能
}
void NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
NVIC_InitStructure.NVIC_IRQChannel=USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStructure);
//配置TIM2中斷
NVIC_InitStructure.NVIC_IRQChannel=TIM2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
void USART3_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
USART_InitStructure.USART_BaudRate=;
USART_InitStructure.USART_WordLength=USART_WordLength_8b;
USART_InitStructure.USART_StopBits=USART_StopBits_1;
USART_InitStructure.USART_Parity=USART_Parity_No;
USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode=USART_Mode_Rx | USART_Mode_Tx;
USART_Init(USART3, &USART_InitStructure);
USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);
USART_Cmd(USART3, ENABLE);
USART_ClearFlag(USART3, USART_FLAG_TC); // 清標(biāo)志
}
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure; //定義GPIO初始化結(jié)構(gòu)體
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10 | GPIO_Pin_11;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_Init(GPIOF, &GPIO_InitStructure);
}
void Timer2_Configuration(void)
{
TIM_TimebaseInitTypeDef TIM_TimebaseStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //打開TIM2定時(shí)器的時(shí)鐘
TIM_DeInit(TIM2); //TIMx寄存器重設(shè)為缺省值
TIM_TimebaseStructure.TIM_Period=781; //自動(dòng)重裝載寄存器周期的值
TIM_TimebaseStructure.TIM_Prescaler=36 - 1; //TIMx 時(shí)鐘頻率除數(shù)的預(yù)分頻值
TIM_TimebaseStructure.TIM_ClockDivision=TIM_CKD_DIV1; //采樣分頻
TIM_TimebaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上計(jì)數(shù)模式
TIM_TimebaseInit(TIM2, &TIM_TimebaseStructure);
TIM_ARRPreloadConfig(TIM2, ENABLE); //允許自動(dòng)重裝載寄存器(ARR)
TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE); //允許TIM2溢出中斷
TIM_Cmd(TIM2, ENABLE); //開啟時(shí)鐘
}
void Uart3_PutChar(u8 ch)
{
GPIO_SetBits(GPIOF, GPIO_Pin_10);
GPIO_SetBits(GPIOF, GPIO_Pin_11);
USART_SendData(USART3, (u8) ch);
while (USART_GetFlagStatus(USART3, USART_FLAG_TC)==RESET); //注意此句與RS232不同
//注意:因?yàn)镽S485的半雙工方式,在RS485發(fā)送數(shù)據(jù)完畢后,需要把RS485設(shè)置在接收狀態(tài),否則收不到主機(jī)的數(shù)據(jù)
GPIO_ResetBits(GPIOF, GPIO_Pin_11);
GPIO_ResetBits(GPIOF, GPIO_Pin_10);
}
void USART3_IRQHandler(void) //在中斷服務(wù)程序中,由于主機(jī)響應(yīng)中斷時(shí)并不知道是哪個(gè)中斷源發(fā)出中斷請求,因此必須在中斷服務(wù)程序中對中斷源進(jìn)行判別,然后分別進(jìn)行處理。當(dāng)然,如果只涉及到一個(gè)中斷請求,是不用做上述判別的。但是無論什么情況,做上述判別是個(gè)好習(xí)慣
{
GPIO_ResetBits(GPIOF, GPIO_Pin_11);
GPIO_ResetBits(GPIOF, GPIO_Pin_10);
if(USART_GetITStatus(USART3, USART_IT_RXNE) !=RESET) //若接收數(shù)據(jù)寄存器滿
{
comm=USART_ReceiveData(USART3); //此語句作用:將USART_DR寄存器的內(nèi)容傳到comm里。另外,在單緩沖器模式下,軟件讀USART_DR寄存器則完成對RXNE位清除。[注意]在多緩沖器模式下,必須通過軟件清零"傳輸完成標(biāo)志"DMA1_FLAG_TCx(即:令DMA_IFCR的位CTCIFx=1),否則將會無法跳出中斷服務(wù)程序,出現(xiàn)一次中斷請求無數(shù)次響應(yīng)的后果
if(comm==0x63) //上位機(jī)自動(dòng)查找采集器是否在線
{
comm=0;
Uart3_PutChar(0x63); //發(fā)送CP的ASCII碼
Uart3_PutChar(0x70);
}
}
}
void TIM2_IRQHandler(void)
{
if(TIM_GetITStatus(TIM2,TIM_IT_Update)!=RESET)
{
TIM_ClearITPendingBit(TIM2,TIM_IT_Update); //清除中斷標(biāo)志
gototime=1;
}
}
int main(void)
{
u16 i;
RCC_Configuration();
ADC_Configuration(); //配置PC0 為ADC1_IN10
GPIO_Configuration();
NVIC_Configuration();
USART3_Configuration();
Timer2_Configuration();
GPIO_ResetBits(GPIOF, GPIO_Pin_11);
GPIO_ResetBits(GPIOF, GPIO_Pin_10);
while(1)
{
if (comm==0x7a) //單片機(jī)發(fā)送數(shù)據(jù)給PC機(jī)
{
for(i=0;i < 256;i++) //根據(jù)過采樣技術(shù),每提高一位AD分辨率,需要增加4倍的采樣率;從12位AD分辨率增加到16位AD分辨率,即增加4位,所以需要增加256倍的采樣率
{
gototime=0;
TIM_Cmd(TIM2, ENABLE); //開啟時(shí)鐘
ADC_SoftwareStartConvCmd(ADC1, ENABLE); //軟件啟動(dòng)ADC轉(zhuǎn)換
while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC )); //等待轉(zhuǎn)換結(jié)束
ad=0;
ad=ADC_GetConversionValue(ADC1); //讀取ADC值
tempu32 +=ad; //累加
while(gototime==0); //延時(shí):390.5us。采樣率:10/秒
TIM_Cmd(TIM2, DISABLE); //關(guān)閉時(shí)鐘
}
//以下數(shù)據(jù)處理和發(fā)送會占用一定的時(shí)間,如果我們不采用過采樣技術(shù),可以把以下代碼放在TIM2定時(shí)之內(nèi)處理
ad=tempu32 >> 4; //16位分辨率,累加值右移4位
ah=ad >> 8; //高8位
al=ad & 0xff; //低8位
Uart3_PutChar(ah);
Uart3_PutChar(al);
tempu32=0;
}
}
}
復(fù)制代碼
所有資料51hei提供下載:
LabVIEW-NTCthermistor-temperature (1).rar
(490.51 KB, 下載次數(shù): 124)
2019-7-17 19:56 上傳
點(diǎn)擊文件名下載附件
文章目錄
前言一、面對的問題篇二、問題解決篇三、后續(xù)工作總結(jié)
前言
我研一的項(xiàng)目利用labview軟件和NI數(shù)據(jù)采集卡采集發(fā)動(dòng)機(jī)傳感器的信號然后進(jìn)行采集,發(fā)動(dòng)機(jī)傳感器是有很多種的,所以難以避免的需要采集多個(gè)通道的傳感器信號。
一、面對的問題篇
前篇已經(jīng)寫道我已經(jīng)將溫度傳感器的信號采集出來,也可以將其數(shù)據(jù)進(jìn)行信號處理,由電壓信號轉(zhuǎn)變?yōu)闇囟戎怠5窍胍杉鄠€(gè)通道的信號,加上TTL信號的曲軸位置傳感器,我模仿溫度傳感器采集的程序另加了一個(gè)DAQ助手進(jìn)行采集。也就是如圖所示的程序:
但是這個(gè)程序不能正常顯示,此時(shí)我面對的問題有:
1、波形圖無法顯示可觀察的波形,更無法對其進(jìn)行運(yùn)算。
2、我不清楚程序里是不是可以使用多個(gè)DAQ助手,用了能顯示么?有干擾么?能同時(shí)工作么?
3、若是用一個(gè)DAQ助手,可以明顯的知道一個(gè)波形圖表里面會有兩個(gè)波形,我們?nèi)绾螌蓚€(gè)波形分離出來,將其進(jìn)行分別處理?
二、問題解決篇
對于第一個(gè)問題:波形圖表無法顯示可以觀察的波形,是因?yàn)閿?shù)據(jù)采集的過快過多,可以在程序里加一個(gè)等待函數(shù),就可以將其正常顯示。
對于第二個(gè)問題:多個(gè)DAQ助手在一個(gè)程序里是不能正常工作的,在與老師的交流后,明白數(shù)據(jù)采集卡其實(shí)是以一個(gè)循環(huán)進(jìn)行采集的,當(dāng)采集完第一個(gè)通道的信號后會采集第二個(gè)通道的信號,所以一個(gè)DAQ助手會占據(jù)每一個(gè)通道,也就是說第二個(gè)DAQ助手的通道被占領(lǐng)無法采集數(shù)據(jù)。所以只能選擇一個(gè)DAQ助手采集多個(gè)通道,現(xiàn)在的問題應(yīng)該轉(zhuǎn)向采集多個(gè)通道后如何將信號多個(gè)通道分開,也就是我們將面對第三個(gè)問題。
對于第三個(gè)問題:我一開始的解決方案是采集到一個(gè)波形圖表里,然后右鍵將其信號進(jìn)行分開顯示,即如下圖的操作:
但是不可以,在將其屬性節(jié)點(diǎn)作為值轉(zhuǎn)換時(shí),它是兩個(gè)波形的值,無法單獨(dú)進(jìn)行信號處理。
所以采用了信號拆分的函數(shù),在其數(shù)據(jù)輸出時(shí)就將信號進(jìn)行分為N個(gè)所需的通道,基本成功,完整程序如下圖:
現(xiàn)在的信號采集基本程序思路已經(jīng)有了,接下來就是信號處理。
三、后續(xù)工作
信號處理主要是TTL信號的曲軸位置傳感器的信號,老板想要通過該傳感器的信號處理得到發(fā)動(dòng)機(jī)轉(zhuǎn)速和加速度物理值,這里可以由波形的橫坐標(biāo)時(shí)間和曲軸的齒數(shù)(60-2)計(jì)算平均速度,然后一段時(shí)間分隔開來可以計(jì)算發(fā)動(dòng)機(jī)的加速度,后續(xù)程序做出來后再寫。
總結(jié)
每次做完項(xiàng)目后就會感覺自己做的東西很簡單。這次的經(jīng)驗(yàn)是可以按需去寫,先寫下自己的需要,然后一點(diǎn)點(diǎn)的去解決需要,可能會更快速一點(diǎn)!
本帖最后由 Alan_Green 于 2019-4-30 22:29 編輯
這里涉及 dht11 數(shù)字溫度濕度傳感器模塊、TM1637數(shù)碼顯示模塊、LabVIEW。
功能:定時(shí)采集溫度,把溫度顯示在數(shù)碼管上,并通過串口發(fā)送給LABVIEW,記錄成EXCEL表格。
這是幾個(gè)月前整的東西吧,當(dāng)時(shí)剛買到R3的板子和模塊,在貼吧里找的庫和代碼,東拼西湊改過來的,(記得改過顯示模塊的庫文件,增加了數(shù)組。。。。只是為了使用方便)這兩個(gè)模塊的庫很好找。這里主要是把LabVIEW連接起來了,其實(shí)LabVIEW也是用自帶的串口通信例程改過來,自己在循環(huán)里添加了程序,把串口收到的數(shù)據(jù)處理成表格保存。
[mw_shl_code=arduino,true]
//
//
#include
pinMode(LED,OUTPUT);
Serial.begin(9600);
//
cli(); // disable global interrupts
TCCR1A=0; // set entire TCCR1A register to 0
TCCR1B=0; // same for TCCR1B
OCR1A=; // set compare match register to desired timer count:
TCCR1B |=(1 << WGM12); // turn on CTC mode:
TCCR1B |=(1 << CS10); // Set CS10 and CS12 bits for 1024 prescaler:
TCCR1B |=(1 << CS12);
TIMSK1 |=(1 << OCIE1A); // enable timer compare interrupt:
sei(); // enable global interrupts:
}
void loop()
{
if(okstage==1){
DHT11.read(DHT11PIN); //讀溫濕度傳感器數(shù)據(jù)存入相應(yīng)數(shù)組
count(); //把溫濕度轉(zhuǎn)換存入顯示數(shù)組
displayLED(); //顯示顯示數(shù)組
send_labview();
// bringled(); //翻轉(zhuǎn)LED
okstage=0;
}
Serial.println();
delay(200);
}
//
void displayLED()
{
for(int i=0;i<4;i++)
{
tm1637.display(i,ListDisp); //What the F***? 這里是ListDisplay 【i】,為什么顯示不出來?
}
}
//
void count()
{
ListDisp[0]=DHT11.temperature / 10;
ListDisp[1]=DHT11.temperature % 10;
// ListDisp[2]=DHT11.humidity / 10;
// ListDisp[3]=DHT11.humidity % 10;
ListDisp[2]=DHT11.temperature_4;
}
//
void bringled()
{
if(ledstage==LOW) ledstage=HIGH;
else ledstage=LOW;
digitalWrite(LED,ledstage);
}
//
void send_labview(){
Serial.write(DHT11.humidity);
Serial.write(DHT11.humidity_1);
Serial.write(DHT11.temperature);
Serial.write(DHT11.temperature_4);
Serial.write(DHT11.jiaoyan);
Serial.println();
}
//
ISR(TIMER1_COMPA_vect)
{
seconds++;
if (seconds==1)
{
seconds=0;
okstage=1;
// readMySensor(); //定時(shí)訪問傳感器或者其他子程序
}
}[/mw_shl_code]
LABVIEW部分框圖.png
(85.38 KB, 下載次數(shù): 59)
下載附件
2019-4-30 21:56 上傳
LABVIEW框圖
LABVIEW前面板.png
(84.11 KB, 下載次數(shù): 38)
下載附件
2019-4-30 21:56 上傳
LABVIEW前面板
串口數(shù)據(jù).png
(17.23 KB, 下載次數(shù): 26)
下載附件
2019-4-30 22:06 上傳
串口數(shù)據(jù)
實(shí)物圖.jpg
(194.73 KB, 下載次數(shù): 26)
下載附件
2019-4-30 22:12 上傳
表格內(nèi)容.png
(98.7 KB, 下載次數(shù): 24)
下載附件
2019-4-30 22:18 上傳
不能上傳表格,只能截圖了。
傳統(tǒng)的溫度測量儀器,其功能及規(guī)格是單一固定的,用戶無法根據(jù)自己的需要改變。NI公司提出的虛擬儀器概念,徹底打破了傳統(tǒng)儀器由廠家定義、用戶無法改變的模式,使測控儀器發(fā)生了巨大變革。LabVIEW是NI公司開發(fā)的一種虛擬儀器平臺,而目前利用LabVIEW進(jìn)行的開發(fā)通常都是建立在LabVIEW所支持的價(jià)格昂貴的數(shù)據(jù)采集板卡之上的。為解決這一問題,本系統(tǒng)采用低功耗單片機(jī)P89LV51RD2和低功耗溫度傳感器TMPll2組成溫度采集節(jié)點(diǎn),并通過無線通信模塊實(shí)現(xiàn)單片機(jī)系統(tǒng)與上位機(jī)的遠(yuǎn)程通信,不僅取代了價(jià)格昂貴的數(shù)據(jù)采集卡,大大降低了系統(tǒng)成本,而且實(shí)現(xiàn)了數(shù)據(jù)的無線傳輸。同時(shí),溫度采集節(jié)點(diǎn)的低功耗特性,降低了ZigBee組網(wǎng)時(shí)對電源的要求,便于進(jìn)行組網(wǎng)實(shí)現(xiàn)多點(diǎn)測溫。
1 系統(tǒng)的組成及工作原理
圖1給出了系統(tǒng)組成框圖,該溫度測控系統(tǒng)主要由計(jì)算機(jī)、單片機(jī)、溫度測量電路、溫度控制電路以及無線通信電路組成。TMPll2溫度傳感器進(jìn)行溫度采集,將溫度數(shù)字量傳送給P89LV51RD2后,通過數(shù)碼管LED電路進(jìn)行現(xiàn)場溫度顯示。同時(shí),P89LV51RD2將溫度數(shù)據(jù)通過無線通信模塊SZ05發(fā)送給遠(yuǎn)程計(jì)算機(jī),運(yùn)行于PC機(jī)上的LabVIEW控制平臺對溫度進(jìn)行實(shí)時(shí)顯示,并進(jìn)行數(shù)據(jù)處理、溫度報(bào)警及數(shù)據(jù)存儲等。另外,控制平臺采樣輸入信號,利用LabVIEW中的PID控制器進(jìn)行PID控制,將控制量通過無線模塊發(fā)送給單片機(jī),單片機(jī)輸出控制量實(shí)現(xiàn)溫度控制。
2 系統(tǒng)硬件設(shè)計(jì)
2.1 溫度測量顯示電路
本系統(tǒng)采用TI公司于2009年6月推出的高精度低功耗數(shù)字溫度傳感器TMPll2來實(shí)現(xiàn)溫度測量。該傳器具有如下特點(diǎn):
◆測溫范圍為-40~125℃;
◆0~65℃溫度范同內(nèi)精度達(dá)O.5℃,-40~125℃范圍內(nèi)精度達(dá)1℃;
◆12位分辨率,測量值的讀取精度達(dá)到0.0625℃;
◆正常操作模式的最大靜態(tài)電流為10μA,關(guān)機(jī)模式則為1μA;
◆電源范圍1.4~3.6 V;
◆SMBus/兩線式串行接口,總線上最多可連接4個(gè)該傳感器。
從功耗、精度、接口等方面綜合考慮,采用P89LV51RD2與TMPll2組成溫度測量節(jié)點(diǎn)。雖然P89LV51RD2單片機(jī)沒有專用的I2C總線接口,但可以使用軟件模擬I2C總線,來實(shí)現(xiàn)單片機(jī)與TMPll2的通信。利用單片機(jī)的I/O口P1.0和P1.1分別模擬I2C總線的SDA和SCL信號,故只需將單片機(jī)的P1.O和P1.1引腳分別與TMPll2的SDA和SCL引腳相連(注意需要上拉)。P89LV51RD2通過I2C總線讀取溫度數(shù)據(jù)后,由5個(gè)數(shù)碼管顯示溫度值,包括百位(或符號位)、十位、個(gè)位與2個(gè)小數(shù)位。
2.2 溫度控制電路
溫度控制電路如圖2所示,它主要由NPN型晶體管Q1、TLP521-1型光電耦合器U1和大功率NMOS管Q2組成。上位機(jī)程序控制系統(tǒng)將檢測溫度值與系統(tǒng)設(shè)定值進(jìn)行比較,按照PID控制算法進(jìn)行運(yùn)算,從單片機(jī)的P1.2口輸出占空比可調(diào)的PWM信號,經(jīng)晶體管Q1驅(qū)動(dòng)后,控制光電耦合器U1的通斷,繼而控制NMOS管Q2(IRF840A)的通斷時(shí)間,從而控制加熱對象——大功率電阻R的加熱時(shí)間,使其達(dá)到設(shè)定的溫度值。為方便實(shí)驗(yàn),采用的R為大功率線繞電阻,額定功率10W,額定電阻10Ω,采用+12V直流電源供電。由于流過加熱電阻R的電流較大,故為R供電的+12V直流電源必須與為其他模擬器件供電的+12V直流電源分開。
2.3 無線通信電路
無線通信電路采用上海順舟網(wǎng)絡(luò)科技有限公司的SZO5系列ZigBee無線數(shù)據(jù)通信模塊來實(shí)現(xiàn)。該模塊提供RS232、RS485和TTL三種接口標(biāo)準(zhǔn),傳輸距離可達(dá)100~2 000m。為了提高開發(fā)效率,采用該模塊的RS232接口,實(shí)現(xiàn)單片機(jī)與計(jì)算機(jī)的串行無線通信,使得軟件編程變得簡單。若系統(tǒng)對距離并無要求,只需使用1根串口線便能實(shí)現(xiàn)單片機(jī)與計(jì)算機(jī)的通信,而不必更改軟件設(shè)計(jì),通用性強(qiáng),適合各種應(yīng)用場合。
3 系統(tǒng)軟件設(shè)計(jì)
3.1 上位機(jī)軟件設(shè)計(jì)
上位機(jī)軟件采用LabVIEW圖形化編程語言來完成控制平臺的設(shè)計(jì)。LabVIEW提供了一個(gè)非常簡潔直觀的圖形化編程環(huán)境,設(shè)計(jì)者可以輕松組建測量系統(tǒng),構(gòu)造友好美觀的操作界面,無需編寫繁瑣的計(jì)算機(jī)程序代碼,大大簡化了程序設(shè)計(jì),提高開發(fā)效率。
圖3給出了上位機(jī)LabVIEW控制平臺的溫度監(jiān)控界面(正在進(jìn)行溫度采集顯示時(shí)的界面)。采用模塊化設(shè)計(jì)思想,該系統(tǒng)主要由數(shù)據(jù)采集與顯示、數(shù)據(jù)處理與報(bào)警、數(shù)據(jù)存儲及PID控制等模塊組成。用戶通過鼠標(biāo)在界面上操作,便可實(shí)現(xiàn)溫度的采集、顯示、處理、報(bào)警、保存及控制等功能。
(1)數(shù)據(jù)采集與顯示模塊
數(shù)據(jù)采集與顯示模塊主要是通過計(jì)算機(jī)串口及無線通信模塊接收單片機(jī)發(fā)送來的溫度數(shù)據(jù),并進(jìn)行實(shí)時(shí)顯示。為了保證計(jì)算機(jī)與單片機(jī)的順利通信,首先應(yīng)進(jìn)行串口初始化,如設(shè)置串口號COMl、波特率9600、8個(gè)數(shù)據(jù)位、1個(gè)停止位,無奇偶校驗(yàn)及流控制。程序運(yùn)行時(shí),單擊“開始采集”按鈕,系統(tǒng)便能接收到單片機(jī)發(fā)送來的溫度數(shù)據(jù),通過溫度儀表控件顯示當(dāng)前采集到的溫度值。此外,數(shù)據(jù)采集模塊所接收到的是一組離散的溫度信號值,通過波形圖表顯示控件進(jìn)行逐點(diǎn)顯示并連線,可繪制出溫度趨勢曲線,拖動(dòng)曲線圖右下方的滑塊,并可查看歷史溫度曲線。
(2)數(shù)據(jù)處理與報(bào)警模塊
數(shù)據(jù)處理主要實(shí)現(xiàn)對采集到的溫度數(shù)據(jù)進(jìn)行直方圖統(tǒng)計(jì)。單擊系統(tǒng)界面上的“創(chuàng)建直方圖”按鈕,系統(tǒng)便執(zhí)行相應(yīng)程序?qū)囟葦?shù)據(jù)進(jìn)行統(tǒng)計(jì),在波形圖控件中顯示溫度直方圖,便于用戶進(jìn)行統(tǒng)計(jì)分析。
溫度報(bào)警模塊主要實(shí)現(xiàn)高溫報(bào)警和低溫報(bào)警。用戶在系統(tǒng)界面中設(shè)置溫度上下限值,當(dāng)實(shí)際溫度大于溫度上限或小于溫度下限時(shí),系統(tǒng)通過指示燈給出高溫報(bào)警(紅燈亮)或低溫報(bào)警(黃燈亮),提示用戶溫度超限,以確保人員及設(shè)備安全。
(3)數(shù)據(jù)存儲模塊
數(shù)據(jù)存儲模塊主要實(shí)現(xiàn)將采集到的溫度數(shù)據(jù)保存至Excel表格,方便用戶日后調(diào)出歷史溫度數(shù)據(jù)進(jìn)行查閱分析。首先利用“數(shù)組大小”VI獲取采集到的溫度數(shù)組的大小,并判斷其能否被10整除,若能整除,執(zhí)行“條件結(jié)構(gòu)”的“真”分支程序,將采集時(shí)間及10個(gè)溫度數(shù)據(jù)寫入電子表格文件后換行,然后再進(jìn)行條件判斷。這樣,溫度數(shù)據(jù)便以10個(gè)為l行記錄到電子表格文件中,同時(shí)每一行的開頭均記錄下了采集本組數(shù)據(jù)的日期與時(shí)間。
另外,利用“方法節(jié)點(diǎn)”和“寫入JPEG文件”VI可將溫度曲線以JPEG格式存儲。用戶單擊“保存溫度曲線”按鈕,系統(tǒng)彈出保存對話框,提示用戶將溫度曲線保存為JPEG圖片。
(4)PID控制模塊
LabVIEW提供了功能強(qiáng)大的PID控制器,使用戶避免了繁瑣的PID算法的編寫,提高開發(fā)效率。進(jìn)行PID控制時(shí),首先將溫度信號輸入至PID控制器,并輸入溫度設(shè)定值和PID增益,包括比例系數(shù)Kc、積分時(shí)間常數(shù)Ti及微分時(shí)間常數(shù)Td。單擊“PID控制”按鈕,程序按照PID算法對溫度進(jìn)行控制,使溫度逼近設(shè)定值。
3.2 下位機(jī)軟件設(shè)計(jì)
P89LV5lRD2單片機(jī)程序采用C語言進(jìn)行設(shè)計(jì)。P89LV51RD2內(nèi)部提供了3個(gè)16位定時(shí)器/計(jì)數(shù)器以及1個(gè)全雙工串行通信口,滿足本系統(tǒng)的軟件設(shè)計(jì)要求。圖4給出了單片機(jī)控制程序流程。
在系統(tǒng)初始化時(shí),設(shè)置8位串行口模式1,以及單片機(jī)的定時(shí)器T2工作在波特率發(fā)生器模式,產(chǎn)生串行通信所需的波特率。再令單片機(jī)的定時(shí)器T0工作在定時(shí)器模式,用于產(chǎn)生指定的控制周期。在TO的中斷程序中,首先將采集到的溫度數(shù)據(jù)通過無線模塊發(fā)送給上位機(jī)進(jìn)行實(shí)時(shí)顯示,然后上位機(jī)利用LabVIEW中的PID控制器,確定系統(tǒng)輸出控制量的大小并發(fā)送回單片機(jī),單片機(jī)根據(jù)控制量輸出PWM信號,驅(qū)動(dòng)控制電路對被測對象進(jìn)行溫度控制。
結(jié)語
本文設(shè)計(jì)的溫度測控系統(tǒng)以低功耗的單片機(jī)系統(tǒng)為采集模塊,代替了價(jià)格昂貴的數(shù)據(jù)采集板卡,成本低,并以LabVIEW開發(fā)的軟件平臺進(jìn)行溫度處理與控制,與傳統(tǒng)儀器相比,具有界面友好、易于操作及擴(kuò)展性強(qiáng)等特點(diǎn)。實(shí)驗(yàn)表明,本系統(tǒng)可以作為教學(xué)實(shí)驗(yàn)系統(tǒng)的一部分,嵌入到虛擬儀器實(shí)驗(yàn)平臺中,供學(xué)生學(xué)習(xí)LabVIEW編程以及虛擬儀器與單片機(jī)的通信。另外,可以將多個(gè)節(jié)點(diǎn)進(jìn)行組網(wǎng),形成一個(gè)分布式無線網(wǎng)絡(luò),實(shí)現(xiàn)多點(diǎn)溫度測量與控制,具有良好的應(yīng)用前景。(單片機(jī)與嵌入式系統(tǒng) 作者:潘曉燁,胡仁杰 東南大學(xué))
這樣例子在LabVIEW中就有,如果你是用NI的溫度測量專用轉(zhuǎn)換器,就更簡單了。
如果用其它的AD卡,需要有LabVIEW驅(qū)動(dòng)。
溫度傳感器一般說噪聲不大,可以直接通過AD卡采集,另外就是有噪聲也可以通過軟件濾波處理。
a/d卡太昂貴了
溫度傳感器-----單片機(jī)-----串口------pc
溫度傳感器-----單片機(jī)-----串口------pc
LabVIEW是一種程序開發(fā)環(huán)境,由美國國家儀器(NI)公司研制開發(fā),類似于C和BASIC開發(fā)環(huán)境,但是LabVIEW與其他計(jì)算機(jī)語言的顯著區(qū)別是:其他計(jì)算機(jī)語言都是采用基于文本的語言產(chǎn)生代碼,而LabVIEW使用的是圖形化編輯語言G編寫程序,產(chǎn)生的程序是框圖的形式。 LabVIEW軟件是NI設(shè)計(jì)平臺的核心,也是開發(fā)測量或控制系統(tǒng)的理想選擇。 LabVIEW開發(fā)環(huán)境集成了工程師和科學(xué)家快速構(gòu)建各種應(yīng)用所需的所有工具,旨在幫助工程師和科學(xué)家解決問題、提高生產(chǎn)力和不斷創(chuàng)新。
下一篇: PLC、DCS、FCS三大控
上一篇: 電氣控制線路圖控制原