国产无码黄电影_麻豆av一区二区三区不卡_伦理在线视频免费观看视频_九九热这里只有精品33_亚洲av中文无码乱人伦在线播放_国产成人精品aa毛片久久_成人欧美一区二区三区的电影在线_78精品国产综合久久香蕉_亚洲日本成本人在线观看

0 賣盤信息
BOM詢價
您現在的位置: 首頁 > 電子資訊 >技術信息 > 基于溫度的MAXQ2000單片機風扇控制辦法(MAX1407 DS1920)

基于溫度的MAXQ2000單片機風扇控制辦法(MAX1407 DS1920)

來源: hqbuy
2024-02-26
類別:技術信息
eye 6
文章創建人 拍明芯城

憑借其眾多功能,MAXQ2000可以創建許多有用的應用,例如通過脈寬調制(PWM)控制風扇的速度。MAXQ2000的眾多功能包括其具有PWM和串行外設接口(SPI )的定時器以及1線 功能。本應用筆記描述了MAXQ2000如何通過PWM實時驅動風扇并改變其速度。這個過程需要使用Maxim的另一款產品,MAX1407多通道數據采集系統(DAS)。利用SPI, MAXQ2000可以與MAX1407(包含16位數字轉換器[ADC]和數字轉換器[DAC])通信。作為使用熱敏電阻的替代方案,MAXQ2000的1-Wire總線主機可以與溫度一起使用按鈕(DS1920)。本應用程序說明中使用的源代碼可下載。

概述

該程序運行在MAXQ2000評估套件(Rev. B)上,借助溫度按鈕(DS1920),或外部熱敏電阻。MAXQ2000評估套件(Rev. B)包括一個LCD顯示器,兩個按鈕,一個MAX1407 ADC,兩個uart,三個定時器,1線和許多其他功能。該程序使用LCD顯示,按鈕和MAX1407或1-Wire來檢測溫度。此外,還需要一個直流風扇和適用的驅動電路,一個熱敏電阻和一個電源。MAXQ2000評估套件將驅動外部電路來控制風扇速度。液晶顯示屏顯示當前溫度,并定期從攝氏到華氏變化。按鈕允許用戶改變風扇的低速和全速溫度閾值。

檢測溫度的默認方法是通過使用按鈕,但如果正確按鈕不可用或通信有問題,程序使用熱敏電阻通過MAXQ2000的SPI來獲得溫度值。的按鈕(DS1920)是一個溫度傳感1線器件。該程序使用RL1005-5744-103-SA熱敏電阻與MAX1407結合使用。

一旦溫度被讀取,顯示被發送到LCD, PWM占空比根據溫度變化進行調整。

程序中有最低溫度和最高溫度兩個閾值,如果溫度低于最低溫度閾值,則風扇關閉;如果溫度高于最高溫度閾值,風扇將被設置為最高轉速。如果溫度介于最小閾值和最大閾值之間,則速度與兩個溫度閾值之間的分數距離成正比。

這兩個閾值可以通過標記為SW4和SW5的兩個按鈕進行配置。SW4將閾值切換為更改——基數或最大值。為變化選擇的閾值顯示在數值數據和C/F字符之間。下劃線表示將更改基本閾值,而overscore表示將更改最大閾值。SW5將當前選擇的閾值增加1。每改變一個門限,系統會重新計算風扇轉速。

這個應用程序需要在MAXQ2000上使用三個定時器中的兩個。定時器1通過熱敏電阻定期檢查溫度,定時器0使用P6.5的PWM輸出來控制風扇。定時器1不能用于PWM,因為它具有與MAX1407通信期間使用的硬件資源。

硬件設置


圖1 將熱敏電阻硬件連接到MAXQ2000評估套件。

首先,使用RL1005-5744-103-SA熱敏電阻和10k歐姆電阻構建熱敏電阻設置。這是通過首先將J7引腳7和8連接到熱敏電阻的一側來完成的。在熱敏電阻的另一側,從J7的引腳1連接一根電線。接下來,連接J7的引腳1和接地(J2的引腳71或72是接地)之間的10k歐姆電阻。如果按鈕選項正在使用,然后是按鈕應放在按鈕夾DS9094FS(或類似的東西),應該焊接到電路板的1線部分。接下來,通過切換SW6.2和SW6.5來啟用按鈕。LCD顯示器連接到J3。為了通過熱敏電阻讀取溫度,打開所有SW3,使其能夠與MAX1407通信。MAX1407的ADC部分將來自熱敏電阻的信號轉換成可用于計算溫度的數字值。an的使用按鈕需要JU7和JU8和an上的跳線按鈕剪輯。


圖2 將PWM輸出連接到風扇的可能硬件設置。

解釋軟件的定義和內容

#define PWMFREQ 1000 //將此更改為所需的PWM頻率#define CPUFREQ 13500000 //將此更改為匹配當前時鐘//頻率#define MIN_TICKS 0 //最小計時器滴答數//風扇克服靜摩擦#define POLLING_INTERVAL 500 //溫度檢查之間的毫秒數//


以下是編譯時要檢查的一些基本定義:

#define LCD0_PATTERN_C 0x039#define LCD0_PATTERN_F 0x071#define lcd0_pattern_0 0x03F#define LCD_PATTERN_1 0x006#define LCD_PATTERN_2 0x05B#define LCD_PATTERN_4 0x066#define LCD_PATTERN_5 0x06D#define LCD_PATTERN_6 0x07D#define LCD_PATTERN_7 0x07F#define LCD_PATTERN_9 0x067int PATTERNS[] = {LCD_PATTERN_0, LCD_PATTERN_1, LCD_PATTERN_2, LCD_PATTERN_4, LCD_PATTERN_5,LCD_PATTERN_6, LCD_PATTERN_7, LCD_PATTERN_8, LCD_PATTERN_9};


使用上述定義,數字的LCD顯示非常容易。LCD模式是預定義的,然后添加到一個名為patterns的數組中以供檢索。顯示某個數字非常簡單,如下所示:

LCD2 = PATTERNS[desired_digit];

定時器1初始化

t2 = 0xFFFF - (CPUFREQ/128/1000*POLLING_INTERVAL);//設置重載值。T2r1 = t2v1;//設置當前定時器值T2C1 = 0x00000;//設置比較值T2CFG1_bit。T2DIV = 7 //設置分割模式為除以128 T2CNA1_bit。Tr2 = 1;//啟動定時器T2CNA1_bit。T2pol0 = 1;//設置極性高T2CNA1_bit。Et2 = 1;//使能定時器中斷T2CNB1_bit。T2oe1 = 1;//打開定時器輸出IMR_bit。Im4 = 1;//啟用模塊4的中斷


定時器1負責定期檢查溫度。初始值(T2V1)取決于溫度輪詢之間的毫秒時間長度(POLLING_INTERVAL)。計算在兩個不同的行上完成的原因是為了防止值變得太大而使寄存器無法處理。T2R1指定定時器到達65,535時返回的值。T2C1被設置在重新加載值(T2R0)以下,以確保它永遠不會產生中斷。T2CFG1是配置許多定時器選項的寄存器。定時器的時鐘劃分被設置為將系統時鐘除以128,這意味著每128個系統時鐘周期相當于1個定時器周期。系統時鐘也可以被分割,然后將一個計時器周期的時間乘以(以2的冪)。T2CNA1是定時器0本身的寄存器。這將啟動定時器運行并啟用定時器中斷,而T2CNB1啟用定時器輸出。最后,啟用模塊4中的中斷。

定時器0初始化

T2V0 = 0xFFFF - (CPUFREQ / PWMFREQ);//設置當前定時器值T2R0 = T2V0;//設置重載值T2C0 = T2R0+1;//設置比較值為加載值+1 T2CNA0_bit。t20e0 = 0;//關閉PWM輸出T2CNA0_bit。T2pol0 = 0;//改變PWM的極性,所以它開始“關閉”T2CNA0_bit。t20e0 = 1;// T2CFG0 = 0x00;//設置定時器分割為1


下一個要初始化的項目是定時器0,它控制PWM,并通過它控制風扇。定時器0是一個16位定時器,與定時器1完全相同。當定時器達到比較值(即T2V0 == T2C0)時,端口引腳狀態倒轉。當定時器重新加載時,端口引腳也反轉(圖3)。t2v0設置定時器的初始值,而T2R2設置重新加載值,兩者都設置為0xFFFF - (CPU頻率/ PWM頻率)。此計算用于使將代碼移植到具有不同CPU時鐘速度的系統或更改所需的PWM頻率更容易。


圖3 端口引腳圖。

子選項T2EO0確保PWM輸出關閉,以改變極性(T2POL0)。當極性開關設為0時,則PWM的啟動狀態為關斷;如上圖所示。T2CFG0確保定時器不分割系統時鐘,并告訴定時器比較T2V0和T2C0。

getadcng負責將信號轉換為數字值。從熱敏電阻中恢復溫度的步驟如下所示。

sendSPI (RD_ADC);//讀取1407的ADC寄存器spiData = sendSPI(0x0FF);spiData |= 0x01;//設置起始轉換位。sendSPI (WR_ADC);//將新值寫回sendSPI(spiData);// 1407寄存器。do {sendSPI(RD_STAT);//讀取1407的狀態寄存器。spiData = sendSPI(0x0FF);} while((spiData &0x02) == 0x00);//位1表示AtoD轉換完成。sendSPI (RD_DATA);//發送命令讀取1407的數據寄存器。SPICF = 0x04;//設置SPI為16位模式。spiData = sendSPI(0x0FFFF);//讀取Data寄存器。SPICF = 0x00;//將SPI調回8位模式。返回spiData;

液晶初始化

/ / LCRA_bit。FRM = 7;//設置幀頻率。/ / LCRA_bit。LCCS = 1;//設置時鐘源為HF/128。/ / LCRA_bit。占空率= 0;//設置靜態占空比。/ / LCRA_bit。Lra = 0;//設置R-adj為0。/ / LCRA_bit。Lrigc = 1;//選擇外置LCD驅動電源。LCRA = 0x03E0;//一次執行所有配置更改。PCF = 0x0F;//設置所有段作為輸出。LCFG_bit。Opm = 1;//設置為正常運行模式。LCFG_bit。Dpe = 1;//啟用顯示。LCD1 = 0x08;


為了顯示當前的溫度,你必須打開液晶顯示器。前五行代碼被注釋掉了,因為它們被壓縮成一條語句。LCRA是LCD調整寄存器,它控制LCD顯示設置。改變FRM設置幀頻率;有了這個,你可以降低頻率和使用更少的功率。幀頻率是用于顯示在LCD上的電源頻率。LCCS將LCD時鐘劃分為128。Duty將顯示設置為靜態,這意味著顯示輸出永遠不會改變。LCFG是LCD配置寄存器。因為LCD只需要顯示,將PCF更改為0x0F將LCD中的所有段設置為輸出。將OPM和DPE設置為1分別打開LCD并使能顯示。LCD1 = 0x08顯示下劃線,表示按鈕將增加最小閾值。通過下面的兩行簡單代碼,LCD顯示器現在處于活動狀態并準備顯示。

LCRA = 0x03E0;LCFG = 0xF3;


所有需要做的就是將值(如PATTERNS[digit]中的項目)加載到LCD寄存器中,這是非常快速和容易的。

初始化按鈕

EIE1 = 0x84;//啟用中斷15和10 EIES1 = 0x84;//設置邊緣過渡。Im1 = 1;//打開模塊1的中斷


現在該初始化按鈕了。與按鈕綁定的中斷為10和15,對應于EIE1(外部中斷啟用1)上的4和80(十六進制)。EIE1啟用這些外部中斷,而EIES1(外部中斷邊緣選擇1)將中斷觸發器設置為下降沿(按下按鈕)。如果這被清除為零,釋放按鈕是觸發中斷的動作。IMR是中斷掩碼寄存器,它跟蹤哪個模塊允許來自哪個模塊的中斷,IM1啟用來自模塊1的中斷。

按鈕中斷

按鈕允許用戶更改base_temp和max_temp閾值。SW4(中斷10)更改將要更改的閾值,而SW5(中斷15)將閾值增加1。如果max_temp值達到149,它會將自身降低為base_temp+1。如果base_temp比max_temp低1,則base_temp變為50。

#pragma vector = 1__interrupt void pushButtonInterrupt {if (EIF1 &0x04) //中斷10 //修改閾值改變{if(last_state == 0) //修改max_temp而不是base_temp {LCD1 = 0x01;//更改顯示下劃線last_state = 1;} else //修改base_temp而不是max_temp {LCD1 = 0x08;Last_state = 0;//將顯示更改為overscore}}


"#pragma vector = 1"是一個編譯器指令,表示該函數處理來自模塊1的任何中斷,模塊1是外部中斷的來源。

pushButtonInterrupt函數首先檢查觸發了哪個中斷。中斷10為0x04,中斷15為0x80。如果它要更改閾值,那么它將更改切換并更新顯示。如果它是閾值增量器,則閾值增加1。如果閾值已達到其上限,則繞到下限。

if (EIF1 &0x80) //中斷15 //增加基本或最大溫度的閾值{if(last_state == 0){//增加base_temp if(base_temp <(max_temp -1)) {++base_temp;如果(base_temp比;LCD4 = 0x40) //如果大于99,則輸出100位的1;else LCD4 = 0;//否則不打印LCD3 = getLCDDigit((base_temp /10) %10);//打印10的數字LCD2 = getLCDDigit(base_temp %10);//打印1的數字}else if (base_temp == max_temp -1) //如果基本溫度將等于最大溫度{//將基本溫度設置為50而不是增加base_temp = 50;LCD3 = getLCDDigit(5);//打印50顯示LCD2 = getLCDDigit(0);}}


如果閾值被修改,它會檢查last_state的值。當last_state為0時,base_temp被修改;否則max_temp會被修改。如果base_temp正好比max_temp小1,程序將base_temp包裝為任意值50。

else if(last_state == 1) //增加max_temp {if(max_temp <149) {++max_temp;如果(max_temp比;99) LCD4 = 0x40;//顯示100位數字else LCD4 = 0;LCD2 = getLCDDigit(max_temp %10);//顯示LCD3 = getLCDDigit((max_temp / 10) %10);//顯示10s位}else {if (max_temp == 149) //如果max_temp為極限,則循環max_temp = base_temp+1;//如果(max_temp >99) LCD4 = 0x40;//清除100位數字否則LCD4 = 0;LCD2 = getLCDDigit(max_temp %10);//顯示LCD3 = getLCDDigit((max_temp / 10) %10);//顯示10s位}}xplier = ((CPUFREQ/PWMFREQ) / (max_temp - base_temp));//重新計算乘數}EIF1 = 0;//清除外部中斷標志


按鈕中斷的這一部分改變了max_temp的閾值。它增加max_temp直到它等于149,然后它繞到比base_temp大1。如果base_temp是65,那么max_temp將是66。

新增加/包裝的值會在LCD上短暫顯示,這樣用戶就知道它已經改變了。下一次計時器重新加載時,LCD會變回溫度,并以溫度更新顯示。

閾值更改后,將重新計算xplier。xplier是決定T2C1值的乘數。在按鈕中斷完成之前,它清除EIF1(外部中斷標志1),以便為下一個中斷做好準備。

定時器1中斷

#pragma vector = 4 __interrupt void timer1Interrupt {T2CNA1_bit。Tr2 = 0;//停止計時器。if(++count == 20) //偶爾改變單位。{count = 0;攝氏= ~攝氏度;} readTemp  ;//獲取并顯示當前溫度。T2CNB1_bit。Tf2 = 0;//清除溢出標志。T2CNB1_bit。Tcc2 = 0;//清除溢出標志。//輸出一個帶有第一個小數點的'alive'信號,LCD0.7 if (count &1) LCD0 = LCD0 | 0x80;else LCD0 = LCD0 &0 x7f;T2CNA1_bit。Tr2 = 1;//啟動定時器}


注意:如果定時器2也被使用,這個函數將運行定時器2的中斷,因為定時器2也位于模塊4。

將TR2設置為0將定時器關閉,然后檢查計數是否等于20。count用于定期將顯示從華氏溫度更改為攝氏溫度。readTemp 調用負責檢測溫度的函數。readTemp完成后,指示可能的計時器溢出的標志(TF2和TCC2)被清除。if語句檢查計數實際上是在每次檢查溫度時創建一個“勾號”。這個“勾號”是啟用或禁用單位字符左邊的小數點。這有助于了解它檢查的頻率和速度,以及當溫度保持不變時它正在運行。最后,計時器再次啟動。

功能

readTemp 函數負責讀取和顯示溫度,以及驅動PWM。

if(re ButtonTemp(&temp)==FALSE) //檢查是否可以找到設備{//如果沒有找到iButton設備adc = getADCRe ng ;//讀取熱敏電阻值。= convertToTemp(adc);//將此值轉換為攝氏度。} showTemp(臨時);//顯示溫度驅動pwm (temp);//更新風扇轉速


它做的第一件事是試圖從1-Wire或按鈕設備。如果沒有有效的1線溫度裝置或通信發生錯誤,則使用熱敏電阻讀取溫度。一旦讀取溫度,通過調用showTemp函數,LCD顯示將更新為最新的溫度。之后,drivePWM改變風扇的轉速。

有關與1-Wire通信的更多信息和按鈕設備,請參閱1-Wire公共領域套件。這是一個軟件開發工具包,包含用C編寫的1-Wire API,并包括本應用程序中使用的溫度示例。

浮點convertToTemp(unsigned int adc){double temp = -0.00135477 * (double)adc + 69.17;返回(浮動)臨時;}


convertToTemp將MAX1407的溫度轉換為攝氏度。請注意,這個公式給出了室溫附近的近似值,并沒有補償熱敏電阻隨溫度的非線性變化。

無效showTemp(int temp){LCFG_bit。Dpe = 0;//禁用顯示。//清除除溫度單位(F或C)以外的所有顯示。LCD0 = ((celsius == 0) ?Lcd0_pattern_f: lcd0_pattern_c);//清除數字LCD1 = LCD2 = LCD3 = LCD4 = 0;if(last_state == 0) //顯示正在編輯的正確閾值LCD1 = 0x08;else LCD1 = 0x01;


showTemp函數所做的第一件事是將單位系統寫入顯示器,然后通過將LCD寄存器設置為0來清除顯示器上的所有數字。然后顯示表示要通過按鈕編輯的閾值的下劃線或下劃線。

if(celsius == 0) {temp = CtoF(temp);//轉換為華氏溫度}if (temp >199) //如果溫度是200+ {temp = temp % 200;} if(temp >99) //如果溫度為100+ {show100s ;//在LCD上顯示一個'1'溫度-= 100;//調整溫度變量。} LCD3 = getLCDDigit(temp / 10);//顯示LCD上的十位LCD2 = getLCDDigit(temp % 10);//顯示LCFG_bit上的1位。Dpe = 1;//啟用顯示。


如果當前的單位制是華氏溫度,則通過函數CtoF將溫度轉換為華氏溫度。如果溫度超過100,它將顯示100位數字的1,并在顯示器上顯示其他數字。

drivePWM是通過改變PWM比較值來設置風扇功率的功能。

T2CNA0_bit。Tr2 = 0;//關閉定時器T2CNA0_bit。t20e0 = 0;//關閉PWM輸出T2CNA0_bit。T2pol0 = 0;//改變PWM的極性,使其從T2CNA0_bit開始。t20e0 = 1;//使PWM輸出T2V0 = T2R0;//手動重新加載定時器值


此順序關閉風扇,然后手動重新加載計時器值。下面,代碼設置了風扇的實際速度。如果溫度低于base_temp閾值,則風扇將設置在盡可能低的設置上,否則它將檢查溫度是否高于最大閾值,在這種情況下,風扇將設置在最高設置上。最后,如果溫度在閾值之間,它會根據溫度計算風扇的轉速。然后計時器被重新打開。


圖4 頂部的輸出是正常的,而底部的跟蹤是可能的,如果計時器沒有停止和手動重新加載。

在更新比較和重新加載值時禁用計時器,以避免無意中反轉輸出,這一點很重要。圖4顯示了兩種類型的輸出。頂部的輸出是正常的,而底部的圖形是可能的,如果計時器沒有停止并手動重新加載。發生的情況是,新的比較值高于當前計時器值,當計時器最終達到新的比較值時,端口引腳狀態反轉,計時器繼續。然而,由于狀態的變化是不希望的,因此它具有反轉定時器輸出極性的效果。

if(temp <= base_temp) //低于此溫度風扇關閉{//強制端口引腳P6.5低PO6 &= 0xDF;} else {if(temp >= max_temp) //超過此溫度風扇全速運行{//強制端口引腳P6.5高PO6 |= 0x20;} else //根據溫度設置風扇轉速{T2C0 = 65535 - ((temp - base_temp) * xplier);if((65535 - T2C0) <Min_ticks) t2c0 = 65535 - Min_ticks;T2CNA0_bit。Tr2 = 1;//重啟定時器}}


高于base_temp閾值的每個度數都有自己的速度,這是基于所需的PWM占空比和兩個閾值之間的范圍。MIN_TICKS是定時器周期的最小數量,PWM輸出必須高,以便風扇以最低速度運行。隨著溫度的升高,風扇轉速呈線性增加。只有當閾值改變時,速度的變化率才會改變。例如,base_temp和max_temp的默認閾值分別為75和85。這意味著xplier(每度風扇轉速的增加)是1350。如果閾值分別更改為75和90,則xplier將為900 -這意味著風扇速度的每一度增加都會減少。導風器越低,風機增加越平穩。

void main {initTimer1 ;//為熱敏電阻初始化timer1 /iButton輪詢initTimer0 ;//初始化PWM輸出timer0 init1407 ;//初始化1407 initOW ;//初始化1線子系統initLCD ;//初始化LCD顯示initPushButtons ;//初始化按鈕__enable_interrupt ;//啟用全局中斷while(1);}


main函數調用初始化函數并啟用全局中斷。程序本身是中斷驅動的,因此它在中斷觸發之前一直處于while循環中。

結論

MAXQ2000是一款高性能微控制器,具有許多有用的功能。溫度驅動的風扇控制應用是使用MAXQ2000的PWM, 1-Wire和SPI功能的一個很好的例子。當這些功能與按鈕和LCD顯示器等交互元素結合在一起時,可能的應用程序的數量幾乎是無限的。


責任編輯:David

【免責聲明】

1、本文內容、數據、圖表等來源于網絡引用或其他公開資料,版權歸屬原作者、原發表出處。若版權所有方對本文的引用持有異議,請聯系拍明芯城(marketing@iczoom.com),本方將及時處理。

2、本文的引用僅供讀者交流學習使用,不涉及商業目的。

3、本文內容僅代表作者觀點,拍明芯城不對內容的準確性、可靠性或完整性提供明示或暗示的保證。讀者閱讀本文后做出的決定或行為,是基于自主意愿和獨立判斷做出的,請讀者明確相關結果。

4、如需轉載本方擁有版權的文章,請聯系拍明芯城(marketing@iczoom.com)注明“轉載原因”。未經允許私自轉載拍明芯城將保留追究其法律責任的權利。

拍明芯城擁有對此聲明的最終解釋權。

標簽: MAXQ2000 MAX1407 DS1920

相關資訊

資訊推薦
云母電容公司_云母電容生產廠商

云母電容公司_云母電容生產廠商

開關三極管13007的規格參數、引腳圖、開關電源電路圖?三極管13007可以用什么型號替代?

開關三極管13007的規格參數、引腳圖、開關電源電路圖?三極管13007可以用什么型號替代?

74ls74中文資料匯總(74ls74引腳圖及功能_內部結構及應用電路)

74ls74中文資料匯總(74ls74引腳圖及功能_內部結構及應用電路)

芯片lm2596s開關電壓調節器的中文資料_引腳圖及功能_內部結構及原理圖_電路圖及封裝

芯片lm2596s開關電壓調節器的中文資料_引腳圖及功能_內部結構及原理圖_電路圖及封裝

芯片UA741運算放大器的資料及參數_引腳圖及功能_電路原理圖?ua741運算放大器的替代型號有哪些?

芯片UA741運算放大器的資料及參數_引腳圖及功能_電路原理圖?ua741運算放大器的替代型號有哪些?

28nm光刻機卡住“02專項”——對于督工部分觀點的批判(睡前消息353期)

28nm光刻機卡住“02專項”——對于督工部分觀點的批判(睡前消息353期)

拍明芯城微信圖標

各大手機應用商城搜索“拍明芯城”

下載客戶端,隨時隨地買賣元器件!

拍明芯城公眾號
拍明芯城抖音
拍明芯城b站
拍明芯城頭條
拍明芯城微博
拍明芯城視頻號
拍明
廣告
恒捷廣告
廣告
深亞廣告
廣告
原廠直供
廣告