久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6406|回復: 12
收起左側(cè)

關(guān)于ds18b20與單片機定時器中斷共存

[復制鏈接]
ID:914633 發(fā)表于 2021-4-30 23:21 | 顯示全部樓層 |閱讀模式
溫度需要實時顯示在LCD上,利用溫度控制pwm占空比調(diào)節(jié)電機速度 。如果在ds18b20讀取溫度前后關(guān)閉開啟中斷,定時器產(chǎn)生的pwm方波會受影響如果不加,溫度又沒辦法讀取。總之如果要溫度正常讀取顯示就沒法正常控制電機速度,要能正常控制定時器產(chǎn)生pwm方波,就不能正常讀取顯示溫度,怎么解決呀


回復

使用道具 舉報

ID:213173 發(fā)表于 2021-5-1 08:14 | 顯示全部樓層
由于ds18b20對時序要求比較嚴格,掌握不好會出錯,所以溫度讀取函數(shù)往往是以一個整體,一次全部完成。但需占用時間較長,約10ms。這就造成與數(shù)碼管動態(tài)掃描,PWM調(diào)制,超聲波測距等其它外設難以協(xié)調(diào)工作。如果仔細分析ds18b20的讀寫函數(shù)時序,可以看出:讀寫1個字節(jié)的時間都不大于1ms,而兩次讀寫1個字節(jié)之間的時間間隔要求不高。這就給與其它外設的分時操作提供機會。溫度讀取函數(shù)使用switch-case-break語句,分若干次運行溫度讀取函數(shù)完成一次讀取溫度的任務。給你一個應用示例參考。 4位數(shù)碼管時鐘溫度表仿真.zip (212.37 KB, 下載次數(shù): 88)
回復

使用道具 舉報

ID:517951 發(fā)表于 2021-5-1 08:50 | 顯示全部樓層
讀DS18B20 和中斷沒關(guān)系,直接 讀就好了,不用開啟關(guān)閉中斷。中斷該干什么活就好了,二者沒有關(guān)聯(lián)和沖突
回復

使用道具 舉報

ID:390416 發(fā)表于 2021-5-1 09:47 | 顯示全部樓層
你要求的PWM周期多少?
回復

使用道具 舉報

ID:390416 發(fā)表于 2021-5-1 09:49 | 顯示全部樓層
DS18B20 每bit 延遲最少35us,讀一次需要1250us
回復

使用道具 舉報

ID:383215 發(fā)表于 2021-5-1 16:59 | 顯示全部樓層
沙發(fā)的回答非常正確,18B20沒有必要一口氣讀完,可以按步數(shù)慢慢的讀,板凳的說法不對,18B20在寫命令和讀出數(shù)據(jù)期間不能被任何中斷打斷,否則數(shù)據(jù)就會錯亂,解決的方法就是兩個,一是18B20在寫命令和讀出數(shù)據(jù)期間關(guān)閉中斷,二是關(guān)閉中斷影響程序運行就把18B20程序放在中斷里一步一步的讀寫,如果還有中斷嵌套就把18B20程序放在最后一級中斷里,最后一級中斷不能有不響應的情況,如果有,還要再想其它方法。曾經(jīng)我過零觸發(fā)可控硅還要調(diào)功,就把18B20程序放在定時中斷里,做到了調(diào)功的情況下也可以讀18B20的溫度,后來發(fā)現(xiàn)不需要調(diào)功,又把18B20程序放回外中斷。
18b20.jpg
這是我在觸發(fā)可控硅外中斷過零檢測程序里分9步讀出18B20溫度,每一步開頭置高一個I/O口結(jié)束拉低I/O口得到的波形圖,上面的波形是過零信號,下面波形高電平部分就是18B20每一步的時間,一開始測試分別置高拉低兩次I/O口把每一步的時間檢測出來,然后再置高拉低一次I/O口把每一步的時間檢測出來,第一步的時間分別是20.9和16.6微秒,第二步的時間分別是68.4和61.3微秒,我就大概知道置高拉低一次I/O口的時間是4微秒左右,我把第二次測試的時間減去4微秒,就比較精確的知道每一步的具體時間,最短的一步是4.88微秒,最長的一步是826微秒,也就是最后一步讀出數(shù)據(jù),感覺好像有點不太對,時間有點長,這個程序運行了好幾年了,沒有發(fā)現(xiàn)問題,AVR單片機內(nèi)部1兆RC振蕩器編出來的。9步一共花了3412.88微秒,這個時間感覺也是偏長, 3412.88微秒是18B20占用單片機的總時間,對于單片機的一個循環(huán)周期,18B20占用單片機的時間最大就是826微秒,所以,我這樣編程CPU應用率算是比較高的,9步讀出18B20溫度的全部時間是80.6毫秒,這是示波器測量出來的時間,都快有0.1秒了,這個時間肯定是嚴重偏長,但是,問題不大,溫度基本上都是漸變,不太可能是突變,就是花一秒鐘把溫度讀出來也沒有任何影響。至于5樓說的DS18B20讀一次需要1250us,這個1250us是讀出18B20溫度的總時間還是某一步的最長時間,我也搞不清楚了。我多次說過編單片機程序必須要有仿真器和示波器,沒有這兩樣東西,我寧愿不編程序,因為編程效率太低了,我從來不計算任何程序的時間,都是設計電路的時候多預留一個I/O口,就用這個口靠示波器測量,示波器是300元左右的虛擬示波器,基本夠我用了,檔次高的示波器測量的精度肯定更高。
所以,樓主想讓18B20與單片機定時器中斷共存,把18B20的程序放在中斷里就可以了,只要pwm的最小脈沖不要小于1000Hz的那個脈沖寬度,18B20與單片機定時器中斷共存,沒有什么難度。

回復

使用道具 舉報

ID:914633 發(fā)表于 2021-5-2 21:56 | 顯示全部樓層
kmsj 發(fā)表于 2021-5-1 16:59
沙發(fā)的回答非常正確,18B20沒有必要一口氣讀完,可以按步數(shù)慢慢的讀,板凳的說法不對,18B20在寫命令和讀出 ...
  1. void time0(void) interrupt 1
  2. {
  3.         TH0 = 0xfc;        //配置1ms定時
  4.         TL0 = 0x18;
  5.                         timer0++;        //timer0開始計數(shù),每1毫秒加一
  6.                    if(timer0>5)  //PWM周期為5毫秒
  7.                 {
  8.                         timer0=0;
  9.                 }
  10.                 if(timer0 <speed)       
  11.                 {
  12.                         PWM=1;
  13.                 }
  14.                 else
  15.                 {
  16.                         PWM=0;
  17.                 }
  18.          switch(step)
  19.          {
  20.                   case 0:Ds18b20Init();break;
  21.                  case 1:Ds18b20WriteByte(0xcc);break;
  22.                  case 2:Ds18b20WriteByte(0x44);break;
  23.                  case 3:Ds18b20Init();break;
  24.                  case 4:Ds18b20WriteByte(0xcc);break;
  25.                  case 5:Ds18b20WriteByte(0xbe);break;
  26.                  case 6:tml = Ds18b20ReadByte();break;
  27.                  case 7:tmh = Ds18b20ReadByte();break;
  28.                  case 8: temp = tmh;
  29.                      temp <<= 8;
  30.                      temp |= tml;break;
  31.                  case 9: display(temp);break;
  32.          } step++;step%=10;          
  33.                
  34.          
  35. }
復制代碼

謝謝了 pwm周期太大了控制電機轉(zhuǎn)的不流暢 只能暫時這樣了
回復

使用道具 舉報

ID:383215 發(fā)表于 2021-5-3 23:30 | 顯示全部樓層
hoodieboi 發(fā)表于 2021-5-2 21:56
謝謝了 pwm周期太大了控制電機轉(zhuǎn)的不流暢 只能暫時這樣了

我從來沒有編過pwm程序,也搞不清楚多高的頻率電機轉(zhuǎn)的流暢?我編的控制可控硅過零觸發(fā),頻率低的要命,倒是很容易,我是用18步讀出兩個18B20的溫度,所以讀寫單個字節(jié)的時間偏長了一些,我是第9步和18步同時讀高低字節(jié),看你的程序,高低字節(jié)你都分開讀了,你已經(jīng)編出占用CPU時間最短,也是最高效的18B20程序,你只有再看看還有什么辦法可以縮短讀寫18B20單個字節(jié)的時間,這個時間就是最小脈寬了,再比這個小,18B20就無法讀出來了。然而我仔細看了你的程序,你是先操作pwm,后讀寫18B20,18B20每一步的時間都不一樣,會不會影響pwm頻率?我的理解是把pwm操作和18B20每一步穿插在一起,操作完一次就運行18B20的一步,不要被18B20不同步數(shù)的時間影響pwm頻率,這個簡單啊,先不讀18B20,試試1000Hz的頻率是否流暢,流暢了再把18B20程序穿插進去,1000Hz不行,只有提高頻率,但也不可能太高,2000Hz可能就很難讀出18B20了。不過我只是猜想,目前我對pwm一竅不通。
回復

使用道具 舉報

ID:383215 發(fā)表于 2021-5-4 11:06 | 顯示全部樓層
我百度了一下,pwm無非就是脈寬調(diào)制,樓主的程序沒有問題,溫度是漸變,可以把case后面的數(shù)字0、1、2、3改成0、10、20、30……,讀寫速度就放慢了10倍,就是改成100、200、300……,放慢100倍也沒有問題,我用10秒鐘讀出18B20的溫度都不會出錯,唯一就是沒有做過讀寫單個字節(jié)最小時間的試驗,因為我用不著啊,估計2000Hz左右的頻率就是極限了,實在不行,樓主只有換讀出時間更短的溫度傳感器或者雙CPU。
回復

使用道具 舉報

ID:213173 發(fā)表于 2021-5-4 18:45 | 顯示全部樓層
hoodieboi 發(fā)表于 2021-5-2 21:56
謝謝了 pwm周期太大了控制電機轉(zhuǎn)的不流暢 只能暫時這樣了

如果樓主實在協(xié)調(diào)不了兩者沖突可以換有內(nèi)置PWM的MCU。如STC15系列。
回復

使用道具 舉報

ID:1075970 發(fā)表于 2023-7-27 00:05 | 顯示全部樓層
hoodieboi 發(fā)表于 2021-5-2 21:56
謝謝了 pwm周期太大了控制電機轉(zhuǎn)的不流暢 只能暫時這樣了

樓主,用了那么多全局變量啊……
回復

使用道具 舉報

ID:1085441 發(fā)表于 2023-7-27 01:30 | 顯示全部樓層
2個辦法,一是單獨用一個單片機都1820溫度,再發(fā)給主單片機。
而是,換I2C接口的溫度傳感器,中斷不影響讀溫度數(shù)據(jù)。
回復

使用道具 舉報

ID:1015233 發(fā)表于 2023-7-27 08:20 | 顯示全部樓層
如果控制器是STM32的話,PWM輸出建議用CCR比較器輸出,可以一個定時器多通道,不需要中斷就可以產(chǎn)生。所以就可以避免被打斷。MSP430F5529也是可以的。如果是51單片機這種的話,那就很難搞了 。極個別STC里面有一些專門產(chǎn)生PWM波形的寄存器,可以直接調(diào)用,不過,難度會大一些。不過可以嘗試
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 91成人在线视频 | 成人二区 | 欧美激情视频网站 | 成人av影院 | 亚洲精品福利在线 | 九色网址 | 青青伊人久久 | 亚洲欧美视频一区 | 欧洲视频一区二区 | gogo肉体亚洲高清在线视 | 亚洲成人av在线 | 999视频| 在线观看中文字幕 | 香蕉久久网 | 免费在线性爱视频 | 久久久久久精 | 成人免费网站www网站高清 | 妞干网视频 | 九九久久久 | 日韩视频精品 | 日韩三区在线 | 男人天堂网址 | 精品久久久久久中文字幕 | 久久国产一区 | 超碰97人人人人人蜜桃 | 日韩在线不卡视频 | 国外成人在线视频网站 | 三级av在线 | 久久se精品一区精品二区 | 久草资源在线视频 | 伊色综合久久之综合久久 | 天天操天天天干 | 成人在线视频观看 | 午夜a v电影 | 99久久影院 | 不卡的av在线 | 久久久久成人精品免费播放动漫 | 在线一区 | 天天色天天射天天干 | 亚洲高清三级 | 99在线免费视频 |