سلام
""اونقدر قوی هست که نیازی به هیچ سلف و ... برای تغذیه نداره ""
منظورتون از این جمله چیست؟؟ من پرسیدم که میونه این آی سی با نویزهای اطراف چجوریه چون من نویز زیادی در اطراف ایم مدارم دارم!ممکنه تو نویز و شار پراکنده محیط کار نکنه یا تداخل توش بیاد؟ تا چه حد؟
برای استفاده از adc های معمولی شما باید یک فیلتر رو سر راه تغذیه avcc قرار بدید ، چون ولتاژ ورودی با ولتاژ روی این پایه مقایسه میشه ، در صورتی که ولتاژ پایه avcc تغییر کنه کلیه محاسبات به هم میریزه .
ولی توی این ایسی نیاز به هیچ گونه فیلتری نیست ، شما فقط ولتاز رو به ورودی اعمال میکنید و خروجی رو میخونید .
این برنامه به زبان c :
کد:
#include <mega88.h>
#asm
.equ __lcd_port=0x0B ;PORTD
#endasm
/////////////////////
#include <lcd.h>
#include <delay.h>
#include <stdio.h>
#include <spi.h>
#include <stdlib.h>
////////////////////
#define ADC_RESET PORTB.1
#define ADC_CS PORTB.2
#define ADC_DRDY PINB.0
#define high 1
#define low 0
//////////////////////
void adc_init(void);
unsigned int read_spi();
// Declare your global variables here
char lcd[16];
unsigned char Watchdog;
// Watchdog Timer initialization
// Watchdog Timer Prescaler: OSC/16
void main(void)
{
// Crystal Oscillator division factor: 1
CLKPR=0x80;
CLKPR=0x00;
// Port B initialization
// Func0=In Func1=In Func2=In Func3=Out Func4=Out Func5=Out Func6=In Func7=Out
// State0=T State1=T State2=T State3=0 State4=0 State5=0 State6=T State7=0
PORTB=0x00;
DDRB=0x2E;
// Port C initialization
// Func0=In Func1=In Func2=In Func3=In Func4=In Func5=In Func6=In Func7=In
// State0=T State1=T State2=T State3=T State4=T State5=T State6=T State7=T
PORTC=0x00;
DDRC=0x00;
// Port D initialization
// Func0=In Func1=In Func2=In Func3=In Func4=In Func5=In Func6=In Func7=In
// State0=T State1=T State2=T State3=T State4=T State5=T State6=T State7=T
PORTD=0x00;
DDRD=0x00;
// Port E initialization
// Func0=In Func1=In Func2=In
// State0=T State1=T State2=T
// Crystal Oscillator division factor: 1
CLKPR=0x80;
CLKPR=0x00;
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=FFh
// OC0 output: Disconnected
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer 1 Stopped
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer 2 Stopped
// Mode: Normal top=FFh
// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// INT2: Off
// Interrupt on any change on pins PCINT0-7: Off
// Interrupt on any change on pins PCINT8-15: Off
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
// Analog Comparator Output: Off
ACSR=0x80;
// SPI initialization
// SPI Type: Master
// SPI Clock Rate: 1000.000 kHz
// SPI Clock Phase: Cycle Start
// SPI Clock Polarity: High
// SPI Data Order: MSB First
SPCR=0x5D;
SPSR=0x00;
lcd_init(16);
while (1)
{
adc_init();
while(1)
{
float resultf;
char data[16];
lcd_clear();
lcd_gotoxy(5,0);
lcd_putsf("DATA:");
lcd_gotoxy(3,1);
resultf=read_spi();
//resultf=read_spi()/0.65535*0.01250;
ftoa(resultf,2,data);
sprintf(lcd," %s",data);
lcd_puts(lcd);
delay_ms(500) ;
Watchdog|=0x01;
}
};
}
////////SPI initializing
void adc_init(void)
{
lcd_clear();
lcd_gotoxy(3,0);
lcd_putsf("Please wait");
ADC_RESET=low;
ADC_CS=low;
ADC_RESET=high;
ADC_CS=high;
delay_ms(3000);
ADC_CS=low;
spi( 0x20 );
ADC_CS=high;
ADC_CS=low;
spi( 0x0c);
ADC_CS=high;
ADC_CS=low;
spi( 0x10);
ADC_CS=high;
ADC_CS=low;
spi( 0x44);
ADC_CS=high;
lcd_gotoxy(3,1);
lcd_putsf("Calibrated");
delay_ms(1000);
lcd_clear();
}
/////////////////////
unsigned int read_spi()
{
unsigned result;
while ( ADC_DRDY);
while (! ADC_DRDY );
while ( ADC_DRDY );
ADC_CS=low;
spi(0x38);
ADC_CS=high;
ADC_CS=low;
result=(unsigned) spi(0)<<8;
ADC_CS=low;
result|=spi(0);
result=(unsigned) ((unsigned long) result);
return result;
و این هم برنامه به زبان شیرین بیسیک :
کد:
$regfile = "m88def.dat"
$crystal = 1000000
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portc.2 , Db5 = Portc.3 , Db6 = Portc.4 , Db7 = Portc.5 , E = Portc.1 , Rs = Portc.0
Cls
Dim Ch2 As Word
Dim Ch3 As Word
Dim Podatki_out As Byte
Dout Alias Portb.4 'podatki AD7714 OUT
Din Alias Pinb.3 'podatki AD7714 IN
Sclk Alias Portb.5 'Clockad7714 Clk
Drdy Alias Pind.2
Podatki_out = &H20
Shiftout Dout , Sclk , Podatki_out , 1 , 8
Podatki_out = &H08
Shiftout Dout , Sclk , Podatki_out , 1 , 8
Podatki_out = &H10
Shiftout Dout , Sclk , Podatki_out , 1 , 8
Podatki_out = &H40 'LO filter vrednost nastavljen na 50Hz (384 110000000)
Shiftout Dout , Sclk , Podatki_out , 1 , 8
Do
Bitwait Drdy , Reset
Locate 2 , 1
Lcd "drdy=0"
Waitus 10
Podatki_out = &H38
Shiftout Dout , Sclk , Podatki_out , 1 , 8
Waitus 10
Shiftin Din , Sclk , Ch3 , 1 , 16
Waitus 10
Home
Lcd "ch3: "
Lcd Ch3
Loop
توی برنامه بالا از spi استفاده نشده ، در صورتی که خواستی با این ایسی کار کنی ، بگو تا من برنامه زبان c رو به زبان بیسیک بنویسم
مدار هم توی دیتاشیت موجود هست