⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 通过这个程序
💻 C
字号:
#include<avr/io.h>
#include<avr/interrupt.h>
#include<avr/signal.h>
//#include<FIR.h>
#define uchar unsigned char
#define uint  unsigned int
#define  steps_N     32   //filter length
/*float FIR_coefficient[steps_N]={-0.50711,0.60589,2.2346,4.1321,4.9897,2.7761,-3.9326,-14.234,
                                 -23.88,-25.932,-13.265,17.938,65.338,119.83,167.87,196.04,196.04,
								 167.87,119.83,65.338,17.938,-13.265,-25.932,-23.88,-14.234,
								 -3.9326,2.7761,4.9897,4.1321,2.2346,0.60589,-0.50711};*/
/*int FIR_coefficient[steps_N]={-17,20,73,135,164,91,-129,-466,-783,-850,-435,588,2141,3927,5501,
                               6424,6424,5501,3927,2141,588,-435,-850,-783,-466,-129,91,164,135,
							   73,20,-17};///2^15*/
/*int  FIR_coefficient[steps_N]={-2,2,9,17,20,11,-16,-58,-98,-106,-54,73,268,491,688,803,803,688,
                                491,268,73,-54,-106,-98,-58,-16,11,20,17,9,2,-2};//2^10*/
/*int  FIR_coefficient[steps_N]={ 0,0,1,1,1,1,-1,-4,-6,-7,-3,5,17,31,43,50,50,
                                 43,31,17,5,-3,-7,-6,-4,-1,1,1,1,1,0,0};//2^8// >>8*/
int FIR_coefficient[steps_N]={ -1,1,2,4,5,3,-4,-15,-24,-27,-14,18,67,123,172,201,201,172,
                                123,67,18,-14,-27,-24,-15,-4,3,5,4,2,1,-1};//2^10  >>10  */
unsigned int FIR_data[steps_N]={0};
void ADC_INT()
{  ADMUX=0xc1;//|_BV(ADLAR);//2.56v片内基准电压,通道1,//数据左对齐
   //ADC使能 ADC开中断  64分频(ADC时钟) 单次转换模式
   ADCSRA=_BV(ADEN)|_BV(ADIE)|_BV(ADPS1)|_BV(ADPS2);//|_BV(ADATE);//在ATMEGA128中 ADATE 是 ADFR
   ADCSRA|=_BV(ADSC);//start first ADC convert
}
void time0_INT()
{  TCNT0=194;//每500US进一次定时器0中断
   TCCR0=_BV(CS01)|_BV(CS00);//64分频//ATMEGA128:............
   TIMSK=_BV(TOIE0);
}
void UART_INT()////////////////////test
{   //接收使能,发送使能,接收中断允许
   UCSRB=_BV(RXEN)|_BV(TXEN)|_BV(RXCIE);
   UBRRL=8;//波特率 57600//UBRRL 8M       *******************************************
}
void send_Nbyte(uchar *UART_TXD_buf,unsigned int N )///////////test
{ unsigned int i=0; 
  while(N--)
   { while( !(UCSRA&( _BV(UDRE) ) ) );
     UDR=*(UART_TXD_buf+i++);
   }
}
SIGNAL(SIG_ADC)
{ volatile long FIR_data1=0;
  uint data_lo,data_hi;
  char N;
  N=steps_N-1;
  data_lo=ADCL;
  data_hi=ADCH;  
  FIR_data[0]=data_hi<<8;
  FIR_data[0]|=data_lo;
  for(;N>0;N--)
     { FIR_data1+=FIR_coefficient[N]*FIR_data[N];
	   FIR_data[N]=FIR_data[N-1];  
	 } 
  FIR_data1+=FIR_data[0]*FIR_coefficient[0];
  FIR_data1>>=10;
  data_hi=0;
  if(FIR_data1&0x100) data_hi|=0x01;
  if(FIR_data1&0x200) data_hi|=0x02;
  send_Nbyte(&data_hi,1);
  data_lo=FIR_data1; 
  send_Nbyte(&data_lo,1);
}
SIGNAL(SIG_OVERFLOW0)//ADC sample rate is 2k 
{  TCNT0=194;//重新装载初值  
   ADCSRA|=_BV(ADSC);//start ADC convert
}
void main()
{ ADC_INT();
  time0_INT();
  UART_INT();////////test
  sei();
  while(1);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -