做了一个mega128的程序,主要功能分为两部分:
1.单片机驱动AD9833产生一个正弦波;
2.单片机AD采集一路模拟电压值,上电之后采集的第一个数据作为初始值,当后来采集的数据和初始值的差大于一个阈值是,就把PB口置为高电平;
现在的问题是:
1.如果程序里只有AD9833的程序时,结果是对的,能够驱动芯片产生需要的波形;
2.当加上AD采集程序以后,并口的电平不发生变化了,AD9833的波形也改变不了(波形改变不了实际也是因为并口电平不发生变化,因为AD9833的时序是用PC口给的)
所以求教各位大神,帮忙看一下程序,在此多谢了!
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
#define Set_Bit(val, bitn) (val |=(1<<(bitn)))
#define Clr_Bit(val, bitn) (val&=~(1<<(bitn)))
void Wave_Generate(ulong,uchar);
volatile uint data[10];
uint Config_Data[8];
volatile uchar flag_first = 0,flag_over = 0;
volatile uint data_first = 0,data_now = 0,data_cha = 0;
volatile uint count = 0;
void main(void)
{
DDRB = 0xFF;
DDRC = 0xFF;
PORTB |= 0xFF;
PORTC=0xFF;
PORTC &= 0xFD;
Wave_Generate(1000,1);
initialize_adc();
while(1)
{
//flag_over和flag_first是两个标志位,这两个标志位在SIGNAL(SIG_ADC)中断里改变
//flag_first意思是第一次采集,把这个数作为初始化的值,flag_over是指一组10个数已经采集完毕
if(flag_over == 1)
{
uchar j;
uchar k;
if(flag_first == 1)
{
data_now = data[0];
for(j = 1; j < 10; j++)
{
data_now = data_now + data[k];
}
data_now = data_now/10;//对10个数取平均
if (data_now > data_first)//取采集的数和初始化的值的差值
{
data_cha = data_now - data_first;
}
else
{
data_cha = data_first - data_now;
}
if (data_cha > 0x14)//判断差值是否大于阈值
{
PORTB = 0xFF;
}
else
{
PORTB = 0x00;
}
}
else//如果是第一次采集就把这个值作为初始化值
{
data_first = data[0];
for(k = 1; k < 10; k++)
{
data_first = data_first + data[k];
}
data_first = data_first/10;
}
flag_over = 0;
}
}
}
void initialize_adc(void)//初始化AD参数
{
ADMUX=0xc6;//采用内部2.56V参考电压,AD采集口用ADC6
ADCSR=0xef;
sei();//打开信号中断
}
SIGNAL(SIG_ADC)//AD采集中断,作用是采集10个数存入一个数组
{
if (flag_over == 0)
{
data[count]=ADC;
count = count + 1;
if(count > 9)
{
count = 0;
flag_over = 1;
flag_first = 1;
}
}
}
//向ad9833写一命令字(2Bytes)
void AD9833_Send_Word(uint Data_In)
{
uchar i;
Set_Bit(PORTC, 1);//SCLK=1;
Clr_Bit(PORTC, 0);//FSYNC=0;
for(i=0;i<16;i++)
{
Set_Bit(PORTC, 1);//SCLK=1;
if(Data_In & 0x8000)
Set_Bit(PORTC, 2);//SDATA=1;
else
Clr_Bit(PORTC, 2);//SDATA=0;
Clr_Bit(PORTC, 1);//SCLK=0;
Data_In=Data_In<<1;
}
Set_Bit(PORTC, 0);//FSYNC=1;
Clr_Bit(PORTC, 1);//SCLK=0;
}
//波形发生函数
//入口参数: 频率:Freq (<=12000000)
//形状:0(正弦波),1(三角波),2(方波)
//默认: Fmclk=25MHz, 0相移,方波不分频.
void Wave_Generate(ulong Freq,uchar Shape)
{
ulong temp;
uchar k;
if(Freq>12000000) Freq=12000000;
switch(Shape)
{
case 0: Config_Data[0]=0x2108;
Config_Data[7]=0x2008;
break;
case 1: Config_Data[0]=0x210A;
Config_Data[7]=0x200A;
break;
case 2: Config_Data[0]=0x2128;
Config_Data[7]=0x2028;
break;
default:Config_Data[0]=0x2108;
Config_Data[7]=0x2008;
}
temp=Freq*10.73; //temp=Freq*(0x10000000/20000000);
Config_Data[1]=temp&0x00003fff;
Config_Data[3]=Config_Data[1];
Config_Data[2]=(temp&0x0fffc000)>>14;
Config_Data[4]=Config_Data[2];
Config_Data[1]=Config_Data[1]|0x4000;
Config_Data[2]=Config_Data[2]|0x4000;
Config_Data[3]=Config_Data[3]|0x8000;
Config_Data[4]=Config_Data[4]|0x8000;
Config_Data[5]=0xC000;
Config_Data[6]=0xE000;
for(k=0;k<8;k++)
{
AD9833_Send_Word(Config_Data[k]);
}
}
|