求助 利用定时器的输入捕获功能捕获PWM信号的占空比 (arduino程序)
#include <stdio.h>#include <avr/interrupt.h>
#include <avr/io.h>
#include <inttypes.h>
#include <avr/signal.h>
//Counts overflovs
volatile uint16_t T4Ovs1, T4Ovs2;
//Variables holding three timestamps
volatile uint16_t Capt1, Capt2, Capt3;
//capture Flag
volatile uint8_t Flag;
volatile uint8_t TEMP;
volatile uint8_t Dutycycle;
#define pin 49
//Initialize timer
void InitTimer4(void)
{
cli();
TCCR4A=0x00;
//Set Initial Timer value
TCNT4=0;
//First capture on rising edge
TCCR4B|=(1<<ICES4);
//Enable input capture and overflow interrupts
TIMSK4|=(1<<ICIE4)|(1<<TOIE4);
TCCR4B|=(1<<ICNC4);
TCCR4B|=(1<<CS40)|(1<<CS41);
sei();
}
//capture ISR
ISR(TIMER4_CAPT_vect)
{
Serial.print("jin ru zhong duan bu huo cheng xu");
Serial.print('\n');
if (Flag==0)
{ //save captured timestamp
Capt1=ICR4;
//change capture on falling edge
TCCR4B&=~(1<<ICES4);
//reset overflows
T4Ovs2=0;
Serial.print("budao shang she yan");
Serial.print('\n');
Serial.print("<Capture1>:"); /*串口输出第一次上升沿捕获时刻*/
Serial.print(Capt1);
Serial.print('\n');
}
if (Flag==1)
{
Capt2=ICR4;
//change capture on rising edge
TCCR4B|=(1<<ICES4);
//save first overflow counter
T4Ovs1=T4Ovs2;
Serial.print("bu huo dao xia jiang yan");
Serial.print('\n');
Serial.print("<Capture2>:"); /*串口输出第一次上升沿捕获时刻*/
Serial.print(Capt2);
Serial.print('\n');
}
if (Flag==2)
{
Capt3=ICR4;
//stop input capture and overflow interrupts
TIMSK4&=~((1<<ICIE4)|(1<<TOIE4));
Serial.print("di er ci bu huo dao shang sheng yan");
Serial.print('\n');
Serial.print("<Capture3>:"); /*串口输出第一次上升沿捕获时刻*/
Serial.print(Capt3);
Serial.print('\n');
}
//increment Flag
Flag++;
}
//Overflow ISR
ISR(TIMER4_OVF_vect)
{
//increment overflow counter
T4Ovs2++;
}
void setup()
{
pinMode(pin,INPUT);
//dutycycle result holder
InitTimer4();
Serial.begin(9600);
sei();
}
void loop()
{
Dutycycle=(((uint8_t)((((uint32_t)(Capt2-Capt1)+((uint32_t)T4Ovs1*0x10000L))*100L)
/((uint32_t)(Capt3-Capt1)+((uint32_t)T4Ovs2*0x10000L)))));
Serial.print("<High Time>:"); /*串口输出高电平的持续时间*/
Serial.print((Capt2-Capt1+T4Ovs1*0x10000L*100L)*0.5);
Serial.print("microsecond");
Serial.print('\n');
Serial.print("<Total Time>:"); /*串口输出脉冲周期*/
Serial.print((Capt3-Capt1+T4Ovs2*10000L)*0.5);
Serial.print("milsecond");
Serial.print('\n');
Serial.print("<Dutycycle>;");/*串口输出占空比*/
Serial.print(Dutycycle);
Serial.print('\n');
//send Duty Cycle value to LCD or USART
TCNT4=0;
//clear flag
Flag=0;
//clear overflow counters;
T4Ovs1=0;
T4Ovs2=0;
//clear interrupt flags to avoid any pending interrupts
TIFR4|=(1<<ICF4)|(1<<TOV4);
//enable input capture and overflow interrupts
TIMSK4|=(1<<ICIE4)|(1<<TOIE4);
}
楼主是女的? 我下载进去了一直都是
页:
[1]