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