|
楼主 |
发表于 2011-2-10 12:09:12
|
显示全部楼层
/*****************************************************************************************************************************
CPU : ATmega16L
CLK : 7.3728 MHz
Buad Rate : 57600
*****************************************************************************************************************************/
#define F_CPU 7372800
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include "ZIG100.h"
#define ID 0x32 //编号2
#define START 0xEC //模块启动命令
#define CALLFLAG 0xFF //接收起始旗标
#define SENSOR 6 //感测轴数
#define TIMES 5 //采样次数
/* 状态参数 */
#define INITIAL 0 //初始
#define ACTION 1 //AD转换
#define TX 2 //传送
#define WAIT 4 //等待ADC完成
/* 指令接收参数 */
#define QUANTITY 2 //指令数据2笔
#define FIRST 0 //索引值 0
#define SECOND 1 //索引值 1
/* USART参数 */
#define FOSC 7372800 // Clock频率 //
#define BUAD 57600 // Buad Rate //
#define UBRR (FOSC/(16*BUAD))-1
/* ADC参数 */
#define ADC_INITI 0x60 // ADC参考电压:AVcc,数据向左对齐 //
/* 各个输入通道 */
#define ADC1 0x01
#define ADC2 0x02
#define ADC3 0x03
#define ADC4 0x04
#define ADC5 0x05
#define ADC6 0x06
volatile int State = 0;
int RxNum = 0;
int Axis = 0, Count = 0; //惯性轴和采样次数
unsigned int ADC_Data[SENSOR][TIMES]; //组合ADC数据
unsigned int ADC_Average[SENSOR]; //ADC平均
unsigned char RX_Command;
//ADC取5次平均//
void AverageFilter(void)
{
int axis, count;
for(axis = 0; axis < SENSOR; axis++)
{
ADC_Average[axis] = INITIAL; //清空上一堆数据
for(count = 0; count < TIMES; count++)
{
ADC_Average[axis] += ADC_Data[axis][count]; //不断累加
}
ADC_Average[axis] /= TIMES; //平均=累加和/5
}
}
//无线传送ADC值//
void ADC_Tx(void)
{
int axis;
ZIG100_Tx(ID); //传送ID
for(axis = 0; axis < SENSOR; axis++)
{
ZIG100_Tx((unsigned char)ADC_Average[axis]); //数据1~6
}
}
//USART接收中断程序//
ISR(USART_RXC_vect)
{
RX_Command = UDR; //读取UDR值,更新RXC
switch(RxNum)
{
case FIRST:
if(RX_Command == CALLFLAG)
{
RxNum = SECOND;
}
break;
case SECOND:
switch(RX_Command)
{
case START: //Capture 命令
UCSRB &= ~_BV(RXEN);
State = ACTION;
break;
case ID: //ID 命令
UCSRB &= ~_BV(RXEN);
State = TX;
break;
}
RxNum = FIRST;
break;
}
}
//ADC中断程序//
ISR(ADC_vect)
{
//在取样次数内即可转换,超过即取平均//
if(Count < TIMES)
{
ADC_Data[Axis][Count] = ADCH;
ADMUX++; //切换channel
Axis++; //切换axis
//重新切换并采样次数+1//
if(Axis == SENSOR)
{
ADMUX = ADC_INITI | ADC1; //再从ADC1开始
Axis = INITIAL;
Count++;
}
State = ACTION;
}
else
{
AverageFilter(); //Count超过后,开始取平均
Count = INITIAL; //重新计数采样次数
State = INITIAL;
}
}
int main(void)
{
DDRA = 0x00; //PA为传感器输入
PORTA = 0x00;
//USART抗干扰//
DDRD = 0x02; //RXD输入,TXD输出
PORTD = 0x03; //RXD上拉电阻有效,TXD输出
ADMUX = ADC_INITI | ADC1; //从 ADC1 开始 //
USART_Initi(UBRR); //设定USART和buad rate
//ADC enable, ADC interrupt enable, ADC_clk=7.3728 M/64=115.2 KHz//
ADCSRA = _BV(ADEN) | _BV(ADIE) | _BV(ADPS2) | _BV(ADPS1);
sei(); //全局中断
while(1)
{
switch(State)
{
case INITIAL:
State = WAIT;
UCSRB |= _BV(RXEN); //启动RX,准备接收讯号进入中断
break;
case ACTION:
ADCSRA |= _BV(ADSC); //ADC start (单次转换, 每次到完成都需要25个ADC_clk周期)
State = WAIT;
break;
case TX:
ADC_Tx();
State = INITIAL;
break;
case WAIT:
// 等待 //
break;
}
}
}
------------------------------------ ZIG100.h ------------------------------------------------
void USART_Initi(unsigned int ubrr)
{
UBRRH = (unsigned char)(ubrr >> 8);
UBRRL = (unsigned char)ubrr;
UCSRB = (1 << RXCIE) | (1 << RXEN) | (1 << TXEN);
UCSRC = (1 << URSEL) | (3 << UCSZ0);
}
void ZIG100_Tx(unsigned char data)
{
while( !(UCSRA & (1 << UDRE)) );
UDR = data;
} |
|