极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 15990|回复: 2

求助 利用定时器的输入捕获功能捕获PWM信号的占空比 (arduino程序)

[复制链接]
发表于 2012-5-24 19:11:42 | 显示全部楼层 |阅读模式
  1. #include <stdio.h>
  2. #include <avr/interrupt.h>
  3. #include <avr/io.h>
  4. #include <inttypes.h>
  5. #include <avr/signal.h>
  6. //Counts overflovs
  7. volatile uint16_t T4Ovs1, T4Ovs2;
  8. //Variables holding three timestamps
  9. volatile uint16_t Capt1, Capt2, Capt3;
  10. //capture Flag
  11. volatile uint8_t Flag;
  12. volatile uint8_t TEMP;
  13. volatile uint8_t Dutycycle;
  14. #define pin 49
  15. //Initialize timer
  16. void InitTimer4(void)
  17. {
  18.   cli();
  19.   TCCR4A=0x00;
  20.   //Set Initial Timer value
  21.   TCNT4=0;
  22.   //First capture on rising edge
  23.   TCCR4B|=(1<<ICES4);
  24.   //Enable input capture and overflow interrupts
  25.   TIMSK4|=(1<<ICIE4)|(1<<TOIE4);
  26.   TCCR4B|=(1<<ICNC4);
  27.   TCCR4B|=(1<<CS40)|(1<<CS41);
  28.   sei();
  29. }

  30. //capture ISR
  31. ISR(TIMER4_CAPT_vect)
  32. {
  33.   Serial.print("jin ru zhong duan bu huo cheng xu");
  34.   Serial.print('\n');
  35.   if (Flag==0)
  36.   { //save captured timestamp
  37.     Capt1=ICR4;
  38.     //change capture on falling edge
  39.     TCCR4B&=~(1<<ICES4);
  40.     //reset overflows
  41.     T4Ovs2=0;
  42.     Serial.print("bu  dao shang she yan");
  43.     Serial.print('\n');
  44.     Serial.print("<Capture1>:");        /*串口输出第一次上升沿捕获时刻*/
  45.     Serial.print(Capt1);
  46.     Serial.print('\n');
  47.   }
  48.   if (Flag==1)
  49.   {  
  50.     Capt2=ICR4;
  51.     //change capture on rising edge
  52.     TCCR4B|=(1<<ICES4);
  53.     //save first overflow counter
  54.     T4Ovs1=T4Ovs2;
  55.     Serial.print("bu huo dao xia jiang yan");
  56.     Serial.print('\n');
  57.     Serial.print("<Capture2>:");        /*串口输出第一次上升沿捕获时刻*/
  58.     Serial.print(Capt2);
  59.     Serial.print('\n');
  60.   }
  61.   if (Flag==2)
  62.   {
  63.     Capt3=ICR4;
  64.     //stop input capture and overflow interrupts
  65.     TIMSK4&=~((1<<ICIE4)|(1<<TOIE4));
  66.     Serial.print("di er ci bu huo dao shang sheng yan");
  67.     Serial.print('\n');
  68.     Serial.print("<Capture3>:");        /*串口输出第一次上升沿捕获时刻*/
  69.     Serial.print(Capt3);
  70.     Serial.print('\n');
  71.   }
  72.   //increment Flag
  73.   Flag++;
  74. }
  75. //Overflow ISR
  76. ISR(TIMER4_OVF_vect)
  77. {
  78.   //increment overflow counter
  79.   T4Ovs2++;
  80. }
  81. void setup()
  82. {
  83.   pinMode(pin,INPUT);
  84.   //dutycycle result holder
  85.   InitTimer4();
  86.   Serial.begin(9600);
  87.   sei();

  88. }
  89. void loop()
  90. {
  91.   Dutycycle=(((uint8_t)((((uint32_t)(Capt2-Capt1)+((uint32_t)T4Ovs1*0x10000L))*100L)
  92.     /((uint32_t)(Capt3-Capt1)+((uint32_t)T4Ovs2*0x10000L)))));
  93.   Serial.print("<High Time>:");      /*串口输出高电平的持续时间*/
  94.   Serial.print((Capt2-Capt1+T4Ovs1*0x10000L*100L)*0.5);  
  95.   Serial.print("microsecond");
  96.   Serial.print('\n');         
  97.   Serial.print("<Total Time>:");      /*串口输出脉冲周期*/
  98.   Serial.print((Capt3-Capt1+T4Ovs2*10000L)*0.5);
  99.   Serial.print("milsecond");        
  100.   Serial.print('\n');
  101.   Serial.print("<Dutycycle>;");/*串口输出占空比*/
  102.   Serial.print(Dutycycle);
  103.   Serial.print('\n');
  104.   //send Duty Cycle value to LCD or USART
  105.   TCNT4=0;
  106.   //clear flag
  107.   Flag=0;       
  108.   //clear overflow counters;
  109.   T4Ovs1=0;
  110.   T4Ovs2=0;
  111.   //clear interrupt flags to avoid any pending interrupts
  112.   TIFR4|=(1<<ICF4)|(1<<TOV4);
  113.   //enable input capture and overflow interrupts
  114.   TIMSK4|=(1<<ICIE4)|(1<<TOIE4);
  115. }
复制代码
回复

使用道具 举报

发表于 2012-5-25 16:15:57 | 显示全部楼层
楼主是女的?
回复 支持 反对

使用道具 举报

发表于 2014-8-21 13:54:06 | 显示全部楼层
我下载进去了一直都是

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-5-2 14:07 , Processed in 0.043837 second(s), 21 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表