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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 6520|回復(fù): 12
打印 上一主題 下一主題
收起左側(cè)

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

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
溫度需要實(shí)時(shí)顯示在LCD上,利用溫度控制pwm占空比調(diào)節(jié)電機(jī)速度 。如果在ds18b20讀取溫度前后關(guān)閉開(kāi)啟中斷,定時(shí)器產(chǎn)生的pwm方波會(huì)受影響如果不加,溫度又沒(méi)辦法讀取。總之如果要溫度正常讀取顯示就沒(méi)法正常控制電機(jī)速度,要能正常控制定時(shí)器產(chǎn)生pwm方波,就不能正常讀取顯示溫度,怎么解決呀


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

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

回復(fù)

使用道具 舉報(bào)

板凳
ID:517951 發(fā)表于 2021-5-1 08:50 | 只看該作者
讀DS18B20 和中斷沒(méi)關(guān)系,直接 讀就好了,不用開(kāi)啟關(guān)閉中斷。中斷該干什么活就好了,二者沒(méi)有關(guān)聯(lián)和沖突
回復(fù)

使用道具 舉報(bào)

地板
ID:390416 發(fā)表于 2021-5-1 09:47 | 只看該作者
你要求的PWM周期多少?
回復(fù)

使用道具 舉報(bào)

5#
ID:390416 發(fā)表于 2021-5-1 09:49 | 只看該作者
DS18B20 每bit 延遲最少35us,讀一次需要1250us
回復(fù)

使用道具 舉報(bào)

6#
ID:383215 發(fā)表于 2021-5-1 16:59 | 只看該作者
沙發(fā)的回答非常正確,18B20沒(méi)有必要一口氣讀完,可以按步數(shù)慢慢的讀,板凳的說(shuō)法不對(duì),18B20在寫(xiě)命令和讀出數(shù)據(jù)期間不能被任何中斷打斷,否則數(shù)據(jù)就會(huì)錯(cuò)亂,解決的方法就是兩個(gè),一是18B20在寫(xiě)命令和讀出數(shù)據(jù)期間關(guān)閉中斷,二是關(guān)閉中斷影響程序運(yùn)行就把18B20程序放在中斷里一步一步的讀寫(xiě),如果還有中斷嵌套就把18B20程序放在最后一級(jí)中斷里,最后一級(jí)中斷不能有不響應(yīng)的情況,如果有,還要再想其它方法。曾經(jīng)我過(guò)零觸發(fā)可控硅還要調(diào)功,就把18B20程序放在定時(shí)中斷里,做到了調(diào)功的情況下也可以讀18B20的溫度,后來(lái)發(fā)現(xiàn)不需要調(diào)功,又把18B20程序放回外中斷。

這是我在觸發(fā)可控硅外中斷過(guò)零檢測(cè)程序里分9步讀出18B20溫度,每一步開(kāi)頭置高一個(gè)I/O口結(jié)束拉低I/O口得到的波形圖,上面的波形是過(guò)零信號(hào),下面波形高電平部分就是18B20每一步的時(shí)間,一開(kāi)始測(cè)試分別置高拉低兩次I/O口把每一步的時(shí)間檢測(cè)出來(lái),然后再置高拉低一次I/O口把每一步的時(shí)間檢測(cè)出來(lái),第一步的時(shí)間分別是20.9和16.6微秒,第二步的時(shí)間分別是68.4和61.3微秒,我就大概知道置高拉低一次I/O口的時(shí)間是4微秒左右,我把第二次測(cè)試的時(shí)間減去4微秒,就比較精確的知道每一步的具體時(shí)間,最短的一步是4.88微秒,最長(zhǎng)的一步是826微秒,也就是最后一步讀出數(shù)據(jù),感覺(jué)好像有點(diǎn)不太對(duì),時(shí)間有點(diǎn)長(zhǎng),這個(gè)程序運(yùn)行了好幾年了,沒(méi)有發(fā)現(xiàn)問(wèn)題,AVR單片機(jī)內(nèi)部1兆R(shí)C振蕩器編出來(lái)的。9步一共花了3412.88微秒,這個(gè)時(shí)間感覺(jué)也是偏長(zhǎng), 3412.88微秒是18B20占用單片機(jī)的總時(shí)間,對(duì)于單片機(jī)的一個(gè)循環(huán)周期,18B20占用單片機(jī)的時(shí)間最大就是826微秒,所以,我這樣編程CPU應(yīng)用率算是比較高的,9步讀出18B20溫度的全部時(shí)間是80.6毫秒,這是示波器測(cè)量出來(lái)的時(shí)間,都快有0.1秒了,這個(gè)時(shí)間肯定是嚴(yán)重偏長(zhǎng),但是,問(wèn)題不大,溫度基本上都是漸變,不太可能是突變,就是花一秒鐘把溫度讀出來(lái)也沒(méi)有任何影響。至于5樓說(shuō)的DS18B20讀一次需要1250us,這個(gè)1250us是讀出18B20溫度的總時(shí)間還是某一步的最長(zhǎng)時(shí)間,我也搞不清楚了。我多次說(shuō)過(guò)編單片機(jī)程序必須要有仿真器和示波器,沒(méi)有這兩樣?xùn)|西,我寧愿不編程序,因?yàn)榫幊绦侍土耍覐膩?lái)不計(jì)算任何程序的時(shí)間,都是設(shè)計(jì)電路的時(shí)候多預(yù)留一個(gè)I/O口,就用這個(gè)口靠示波器測(cè)量,示波器是300元左右的虛擬示波器,基本夠我用了,檔次高的示波器測(cè)量的精度肯定更高。
所以,樓主想讓18B20與單片機(jī)定時(shí)器中斷共存,把18B20的程序放在中斷里就可以了,只要pwm的最小脈沖不要小于1000Hz的那個(gè)脈沖寬度,18B20與單片機(jī)定時(shí)器中斷共存,沒(méi)有什么難度。

回復(fù)

使用道具 舉報(bào)

7#
ID:914633 發(fā)表于 2021-5-2 21:56 | 只看該作者
kmsj 發(fā)表于 2021-5-1 16:59
沙發(fā)的回答非常正確,18B20沒(méi)有必要一口氣讀完,可以按步數(shù)慢慢的讀,板凳的說(shuō)法不對(duì),18B20在寫(xiě)命令和讀出 ...
  1. void time0(void) interrupt 1
  2. {
  3.         TH0 = 0xfc;        //配置1ms定時(shí)
  4.         TL0 = 0x18;
  5.                         timer0++;        //timer0開(kāi)始計(jì)數(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. }
復(fù)制代碼

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

使用道具 舉報(bào)

8#
ID:383215 發(fā)表于 2021-5-3 23:30 | 只看該作者
hoodieboi 發(fā)表于 2021-5-2 21:56
謝謝了 pwm周期太大了控制電機(jī)轉(zhuǎn)的不流暢 只能暫時(shí)這樣了

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

使用道具 舉報(bào)

9#
ID:383215 發(fā)表于 2021-5-4 11:06 | 只看該作者
我百度了一下,pwm無(wú)非就是脈寬調(diào)制,樓主的程序沒(méi)有問(wèn)題,溫度是漸變,可以把case后面的數(shù)字0、1、2、3改成0、10、20、30……,讀寫(xiě)速度就放慢了10倍,就是改成100、200、300……,放慢100倍也沒(méi)有問(wèn)題,我用10秒鐘讀出18B20的溫度都不會(huì)出錯(cuò),唯一就是沒(méi)有做過(guò)讀寫(xiě)單個(gè)字節(jié)最小時(shí)間的試驗(yàn),因?yàn)槲矣貌恢。烙?jì)2000Hz左右的頻率就是極限了,實(shí)在不行,樓主只有換讀出時(shí)間更短的溫度傳感器或者雙CPU。
回復(fù)

使用道具 舉報(bào)

10#
ID:213173 發(fā)表于 2021-5-4 18:45 | 只看該作者
hoodieboi 發(fā)表于 2021-5-2 21:56
謝謝了 pwm周期太大了控制電機(jī)轉(zhuǎn)的不流暢 只能暫時(shí)這樣了

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

使用道具 舉報(bào)

11#
ID:1075970 發(fā)表于 2023-7-27 00:05 | 只看該作者
hoodieboi 發(fā)表于 2021-5-2 21:56
謝謝了 pwm周期太大了控制電機(jī)轉(zhuǎn)的不流暢 只能暫時(shí)這樣了

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

使用道具 舉報(bào)

12#
ID:1085441 發(fā)表于 2023-7-27 01:30 | 只看該作者
2個(gè)辦法,一是單獨(dú)用一個(gè)單片機(jī)都1820溫度,再發(fā)給主單片機(jī)。
而是,換I2C接口的溫度傳感器,中斷不影響讀溫度數(shù)據(jù)。
回復(fù)

使用道具 舉報(bào)

13#
ID:1015233 發(fā)表于 2023-7-27 08:20 | 只看該作者
如果控制器是STM32的話(huà),PWM輸出建議用CCR比較器輸出,可以一個(gè)定時(shí)器多通道,不需要中斷就可以產(chǎn)生。所以就可以避免被打斷。MSP430F5529也是可以的。如果是51單片機(jī)這種的話(huà),那就很難搞了 。極個(gè)別STC里面有一些專(zhuān)門(mén)產(chǎn)生PWM波形的寄存器,可以直接調(diào)用,不過(guò),難度會(huì)大一些。不過(guò)可以嘗試
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: av一区二区三区在线观看 | 久久国产精品视频 | 在线一区视频 | 最新91在线 | 性做久久久久久免费观看欧美 | 成人国产在线视频 | 成年人视频在线免费观看 | 鸳鸯谱在线观看高清 | 精品久久久久久久久久久久 | 欧美激情综合五月色丁香小说 | 伊人婷婷 | 日韩一区二区三区在线视频 | 日韩高清成人 | 国产精品免费一区二区三区 | 久久中文字幕一区 | 免费日韩av| 91精品国产91久久久久游泳池 | 久久看片| 国产一区二区三区在线免费 | 欧美激情久久久久久 | 特级a欧美做爰片毛片 | 欧美三级三级三级爽爽爽 | 国产女人与拘做受视频 | 日本中文字幕视频 | 亚洲精品在线播放 | 91麻豆精品国产91久久久久久 | 国产黄色免费网站 | 中文字幕一区二区三区乱码在线 | 成人中文网 | 中文字幕一区二区三区精彩视频 | 日韩一级精品视频在线观看 | 成人欧美一区二区三区黑人孕妇 | 亚洲欧美日韩久久 | 午夜精品久久久久久久久久久久久 | 精品国产色 | 国产二区三区 | 高清视频一区二区三区 | 日韩精品一区二区三区四区视频 | 日本亚洲精品 | 7799精品视频天天看 | 国产精品久久久 |