找回密碼
         注冊會員
        搜索附件  

        原理圖.pdf

         

        M16捕捉及12位PWM輸出試驗:
        經(jīng)過一段時間的摸索,ICP及PWM終于取得了收獲。我要做的實驗是要求ICP進行捕捉來測量脈沖的頻率,計算出的結(jié)果顯示在5位LED數(shù)碼管上,同時利用12位的PWM輸出測量結(jié)果。測量電路與以前做過的“M16頻率測量及PWM”一文的電路相同,脈沖信號輸入到T0及ICP引腳。各計數(shù)器的作用如下:
        Timer0:對外部脈沖進行計數(shù),使用溢出中斷,在其中斷服務(wù)程序中對溢出次數(shù)進行計數(shù);
        Timer1:ICP捕捉及PWM控制,工作在方式15,OCR1A的值定為0x0FFF,使用ICP捕捉中斷和溢出中斷。 溢出中斷服務(wù)程序中對Timer1的溢出次數(shù)進行計數(shù),ICP中斷服務(wù)程序中讀出Timer0的TCNT0及其溢出次數(shù)、Timer1的溢出次數(shù)及ICR1的值,并且允許中斷嵌套;
        Timer2:工作在CTC方式,產(chǎn)生1mS的定時中斷,用于LED數(shù)碼管的動態(tài)掃描和測量閘門的控制。
        在開始試驗時,由于開放的中斷比較多,其實際的響應(yīng)與我的設(shè)想存在偏差,因此測量的結(jié)果總是不穩(wěn)定,表現(xiàn)為顯示值隨機跳動比較的大。通過JTAG的觀察發(fā)現(xiàn),引起這種原因的根源在于,T0、T1及ICP的中斷可能同時觸發(fā),而根據(jù)AVR的中斷優(yōu)先級設(shè)定,ICP會搶先進入中斷,導致了ICP中斷服務(wù)程序中讀到的T0或T1的溢出值不正確,最終影響依次計算結(jié)果。當采用了中斷嵌套方式后,這個問題基本上得到了解決,出現(xiàn)異常的情況已經(jīng)無法用肉眼觀察到。
        程序用CVAVR編寫,源碼如下:

        1. /*********************************************
        2. This program was produced by the
        3. CodeWizardAVR V1.23.8d Professional
        4. Automatic Program Generator
        5. ?Copyright 1998-2003 HP InfoTech s.r.l.
        6. http://www.hpinfotech.ro
        7. e-mail:office@hpinfotech.ro

        8. Project :
        9. Version :
        10. Date    : 2005-5-23
        11. Author  : Bucker
        12. Company :
        13. Comments:


        14. Chip type           : ATmega16L
        15. Program type        : Application
        16. Clock frequency     : 8.000000 MHz
        17. Memory model        : Small
        18. External SRAM size  : 0
        19. Data Stack size     : 256
        20. *********************************************/

        21. #include <mega16.h>
        22. #include <sbit.h>
        23. #define EnableICP 10

        24. flash char LedDat[]={/*0,1,2,3,4,5,6,7,8,9,A,b,C,d,E,F,-,*/
        25. 0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x58,0x5E,0x79,0x71,0x40};
        26. unsigned char LED[6],Status=0,Time0H,Time0L,Timer0H=0;
        27. unsigned int Timer1H=0,Time1H,Time1L,Na=0;

        28. // Timer 0 overflow interrupt service routine
        29. interrupt [TIM0_OVF] void timer0_ovf_isr(void)
        30. {
        31. // Place your code here
        32. Timer0H++;
        33. }

        34. // Timer 1 overflow interrupt service routine
        35. interrupt [TIM1_OVF] void OldTimer1_ovf_isr(void)
        36. {
        37. // Place your code here
        38. Timer1H++;
        39. }

        40. #pragma savereg-

        41. // Timer 1 input capture interrupt service routine
        42. interrupt [TIM1_CAPT] void OldTimer1_capt_isr(void)
        43. {
        44. // Place your code here
        45. unsigned char sREG;
        46. #asm("sei")
        47. #asm("st -y,r30")
        48. sREG=SREG;
        49. Time0L=TCNT0;
        50. Time1L=ICR1;
        51. Time1H=Timer1H;
        52. Time0H=Timer0H;
        53. BitSet(Status,0);
        54. BitClr(TIMSK,5);
        55. Na=0;
        56. SREG=sREG;
        57. #asm("ld r30,y+")
        58. }

        59. #pragma savereg+

        60. // Timer 2 output compare interrupt service routine
        61. interrupt [TIM2_COMP] void timer2_comp_isr(void)
        62. {
        63. // Place your code here
        64. static char Nb=0;
        65. #asm("sei")
        66. if (Nb<5)
        67. {
        68. PORTA=LED[Nb];
        69. PORTD&=0xF8;
        70. PORTD|=Nb;
        71. }
        72. else PORTA=0x00;
        73. if (++Nb>10) Nb=0;
        74. if (Na<60000)
        75. {
        76. if (Na++>EnableICP)
        77. {
        78. BitSet(TIFR,5);
        79. BitSet(TIMSK,5);
        80. }
        81. }
        82. }

        83. // Declare your global variables here

        84. void main(void)
        85. {
        86. // Declare your local variables here
        87. unsigned int a,b=0,OldTimer0,Timer0;
        88. unsigned long L,OldTimer1,Timer1,Temp1,Temp0;
        89. // Input/Output Ports initialization
        90. // Port A initialization
        91. // Func0=Out Func1=Out Func2=Out Func3=Out Func4=Out Func5=Out Func6=Out Func7=Out
        92. // State0=0 State1=0 State2=0 State3=0 State4=0 State5=0 State6=0 State7=0
        93. PORTA=0x00;
        94. DDRA=0xFF;

        95. // Port B initialization
        96. // Func0=In Func1=In Func2=In Func3=In Func4=In Func5=In Func6=In Func7=In
        97. // State0=T State1=T State2=T State3=T State4=T State5=T State6=T State7=T
        98. PORTB=0x00;
        99. DDRB=0x00;

        100. // Port C initialization
        101. // Func0=In Func1=In Func2=In Func3=In Func4=In Func5=In Func6=In Func7=In
        102. // State0=T State1=T State2=T State3=T State4=T State5=T State6=T State7=T
        103. PORTC=0x00;
        104. DDRC=0x00;

        105. // Port D initialization
        106. // Func0=Out Func1=Out Func2=Out Func3=In Func4=Out Func5=In Func6=In Func7=In
        107. // State0=0 State1=0 State2=0 State3=T State4=T State5=T State6=T State7=T
        108. PORTD=0x00;
        109. DDRD=0x07;

        110. // Timer/Counter 0 initialization
        111. // Clock source: T0 pin Rising Edge
        112. // Mode: Normal top=FFh
        113. // OC0 output: Disconnected
        114. TCCR0=0x07;
        115. TCNT0=0x00;
        116. OCR0=0x00;

        117. // Timer/Counter 1 initialization
        118. // Clock source: System Clock
        119. // Clock value: 8000.000 kHz
        120. // Mode: Fast PWM top=OCR1A
        121. // OC1A output: Discon.
        122. // OC1B output: Non-Inv.
        123. // Noise Canceler: Off
        124. // Input Capture on Falling Edge
        125. TCCR1A=0x23;
        126. TCCR1B=0x19;
        127. TCNT1H=0x00;
        128. TCNT1L=0x00;
        129. ICR1H=0x00;
        130. ICR1L=0x00;
        131. OCR1AH=0x0F;
        132. OCR1AL=0xFF;
        133. OCR1BH=0x00;
        134. OCR1BL=0x00;
        135. // Timer/Counter 2 initialization
        136. // Clock source: System Clock
        137. // Clock value: 250.000 kHz
        138. // Mode: CTC top=OCR2
        139. // OC2 output: Disconnected
        140. ASSR=0x00;
        141. TCCR2=0x0B;
        142. TCNT2=0x00;
        143. OCR2=0xF9;

        144. // External Interrupt(s) initialization
        145. // INT0: Off
        146. // INT1: Off
        147. // INT2: Off
        148. MCUCR=0x00;
        149. MCUCSR=0x00;

        150. // Timer(s)/Counter(s) Interrupt(s) initialization
        151. TIMSK=0xA5;

        152. // Analog Comparator initialization
        153. // Analog Comparator: Off
        154. // Analog Comparator Input Capture by Timer/Counter 1: Off
        155. // Analog Comparator Output: Off
        156. ACSR=0x80;
        157. SFIOR=0x00;

        158. // Global enable interrupts
        159. #asm("sei")

        160. while (1)
        161. {
        162. // Place your code here
        163. if (BitTst(Status,0))
        164. {
        165. Timer0=Time0L|(unsigned int)Time0H<<8;
        166. Timer1=Time1L|(unsigned long)Time1H<<16;
        167. L=8e6/59986*60000/(Temp1=(Timer1-OldTimer1))*(Temp0=(Timer0-OldTimer0));
        168. if (L/10!=9932)
        169. {
        170. if (b++>2)
        171. {
        172. PORTA=0x00;
        173. b=0;
        174. }
        175. }
        176. OldTimer1=Timer1;
        177. OldTimer0=Timer0;
        178. LED[0]=LedDat[L/10000];
        179. a=L % 10000;
        180. LED[1]=LedDat[a/1000];
        181. a%=1000;
        182. LED[2]=LedDat[a/100];
        183. a%=100;
        184. LED[3]=LedDat[a/10];
        185. LED[4]=LedDat[a % 10] | 0x80;
        186. BitClr(Status,0);
        187. }
        188. }
        189. }

        復制代碼


        dddddddddddddddddddddddddddddddddddddddddddddddddddddddd
        非常感謝, 準備學呢,但不知道能不能堅持

        QQ|手機版|MCU資訊論壇 ( 京ICP備18035221號-2 )|網(wǎng)站地圖

        GMT+8, 2025-3-16 22:09 , Processed in 0.023569 second(s), 8 queries , Redis On.

        Powered by Discuz! X3.5

        © 2001-2024 Discuz! Team.

        返回頂部
        亚洲国产七七久久桃花| 久久精品国产91久久麻豆自制 | 欧美精品在线免费| 国产专区日韩精品欧美色| 精品午夜国产人人福利| 92精品国产自产在线观看| 精品一区二区三区免费观看| 黄网在线免费观看| 国内精品51视频在线观看| 久久精品无码一区二区app| 亚洲日韩精品射精日| 欧美精品国产精品| 亚洲国产精品专区在线观看| 国产在线精品无码二区| 无码精品A∨在线观看| 综合人妻久久一区二区精品| 国产精品1区2区| 97精品人妻系列无码人妻| 亚洲精品视频在线| 亚洲福利精品一区二区三区| 久久夜色精品国产噜噜亚洲AV| 国产精品黄页免费高清在线观看| 欧美日韩一区二区三区韩大| 精品国内片67194| 午夜国产精品无套| 91精品欧美综合在线观看| 免费人成在线观看欧美精品 | 97精品国产91久久久久久| 国产系列高清精品第一页| 亚洲精品美女久久777777| 久久99国产精品久久99| 亚洲乱码日产精品a级毛片久久| 国产亚洲精品无码专区| 好硬好湿好爽在深一点动态图| 久久精品嫩草影院| 丝袜足控一区二区三区| 四虎影视国产精品亚洲精品hd| 伊人影院蕉久影院在线免费观看| 亚洲日韩中文在线精品第一| freesexvideos精品老师毛多| 精品日韩欧美国产|