找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

晶閘管過零調(diào)功器,假如單片機定時器0設(shè)置100個周期時間,定時器1設(shè)置導(dǎo)通周期時間

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:1018689 發(fā)表于 2022-5-13 10:36 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
晶閘管過零調(diào)功器,假如定時器0設(shè)置100個周期時間,定時器1設(shè)置導(dǎo)通周期時間,檢測到零點時,單片機外部中斷下降沿觸發(fā),怎么設(shè)置外部中斷在100個周期時間內(nèi)只觸發(fā)一次。
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:332444 發(fā)表于 2022-5-13 14:52 | 只看該作者
回復(fù)

使用道具 舉報

板凳
ID:123289 發(fā)表于 2022-5-13 17:12 | 只看該作者
不建議用軟件觸發(fā)。學(xué)習(xí)時除外。
方法:假如定時器0的中斷周期為1,也就是你所講的【設(shè)置100個周期時間】中的1個周期。
1、設(shè)置一個計數(shù)寄存器,作為觸發(fā)角名為:R_CFJ。
2、檢測到零點時:設(shè)置觸發(fā)角,讓R_CFJ=33(開始計時,假設(shè)你需要觸發(fā)角=33個周期)。
3、中斷產(chǎn)生(服務(wù)程序):
  3.1、如果R_CFJ=0(還未起動),什么也不做退出。
  3.2、 如果R_CFJ<>0,則將R_CFJ-1(計時),并看看R_CFJ=0?
         3.2.1、 <>0(觸發(fā)時間未到),什么也不做退出;
         3.2.2、 =0(觸發(fā)時間到了),則給出觸發(fā)可控硅的脈沖。
以下教你【如何保證在80個周期時間內(nèi)只觸發(fā)一次!
參考方式一:再增加一個識別器TT,
檢測到零點時:讓TT=80,
每次中斷時,TT=0不動它,TT<>0則-1。
發(fā)出觸發(fā)脈沖前,如果TT<>0(說明距上次觸發(fā)時間不足80個周期)則拒發(fā);如果=0,則正常發(fā)出脈沖。
回復(fù)

使用道具 舉報

地板
ID:883242 發(fā)表于 2022-5-13 18:38 | 只看該作者
實在搞不懂為什么要用定時器,過零觸發(fā)定時器完全沒有用么。
只用外部中斷就可以實現(xiàn)全部功能。
  1. exti_interrupt(){
  2.   static int i;
  3.   if(i<j){
  4.     delay10us();
  5.     trig();
  6.   }
  7.   if(++i>100)i=0;
  8. }
復(fù)制代碼

其中delay10us();是為了防止觸發(fā)時電壓過低,可控硅無法達到保持電流從而造成觸發(fā)失敗,等過零后電壓上升到一定程度再進行觸發(fā)。
trig();看你怎么觸發(fā)了,暫時不好寫,可能用光耦,也可能用觸發(fā)變壓器。
j就是你設(shè)定的“只觸發(fā)一次”的一。
回復(fù)

使用道具 舉報

5#
ID:123289 發(fā)表于 2022-5-14 08:59 | 只看該作者
delay():
1、會占用CPU的時間,在此時間內(nèi)無法做其它事。尤其是導(dǎo)通角大的時候,占用時間更多。
2、延時會不準(zhǔn)。當(dāng)CPU發(fā)生中斷時,極可能打斷delay(),一直要到中斷程序返回。這段時間就會插入到里面。
當(dāng)delay()在中斷程序中運行時,delay()是準(zhǔn)了,但它會耽誤其它程序的運行。例如其它可控硅的觸發(fā)。
注:
delay()是我最不推愿意使用的東東。也就最害初學(xué)者的東東。你可以不信。當(dāng)你的設(shè)計比較復(fù)雜時,就會知道了。例如:【多鍵】【多點陣顯示】【多串行通訊】……同時應(yīng)用時。
回復(fù)

使用道具 舉報

6#
ID:883242 發(fā)表于 2022-5-14 18:19 | 只看該作者
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <stdint.h>
  4. #define MAX 173
  5. #define CUR 23

  6. int main(int argc, char **argv)
  7. {
  8.     uint32_t trigger_table[MAX];
  9.     for(uint16_t i=0;i<MAX;i++)trigger_table[i]=0;
  10.     for(uint16_t i=0;i<CUR;i++)trigger_table[MAX*i/CUR]=(MAX*i/CUR)%2?1:-1;
  11.     for(uint16_t i=0;i<MAX;i++)printf("%d,",trigger_table[i]);
  12. }
復(fù)制代碼
這是過零調(diào)功如何把功率均勻分布的代碼,MAX是總周期半波個數(shù),CUR是導(dǎo)通次數(shù)。
實際執(zhí)行起來的圖如下:

樓上某位根本不懂什么叫“過零調(diào)功”的灌水大師就別來%了。
回復(fù)

使用道具 舉報

7#
ID:1018689 發(fā)表于 2022-5-18 19:09 | 只看該作者
yzwzfyz 發(fā)表于 2022-5-13 17:12
不建議用軟件觸發(fā)。學(xué)習(xí)時除外。
方法:假如定時器0的中斷周期為1,也就是你所講的【設(shè)置100個周期時間】 ...

好的,謝了,我再研究研究
回復(fù)

使用道具 舉報

8#
ID:1018689 發(fā)表于 2022-5-18 19:09 | 只看該作者
Hephaestus 發(fā)表于 2022-5-14 18:19
這是過零調(diào)功如何把功率均勻分布的代碼,MAX是總周期半波個數(shù),CUR是導(dǎo)通次數(shù)。
實際執(zhí)行起來的圖如下:
...

好的,謝了,我再研究研究
回復(fù)

使用道具 舉報

9#
ID:883242 發(fā)表于 2022-5-18 21:12 | 只看該作者
安分的女漢子 發(fā)表于 2022-5-18 19:09
好的,謝了,我再研究研究

你為什么不去研究我在地板位的回復(fù)???那個才是最重要的,屬于雪中送炭。6樓我的回復(fù)算錦上添花,做了很好,不做也沒問題。
回復(fù)

使用道具 舉報

10#
ID:1018689 發(fā)表于 2022-5-18 21:50 | 只看該作者
Hephaestus 發(fā)表于 2022-5-18 21:12
你為什么不去研究我在地板位的回復(fù)???那個才是最重要的,屬于雪中送炭。6樓我的回復(fù)算錦上添花,做了 ...

好的謝謝
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表