Hello, All !
HÁÐÉÓÁÌ (ÓÏÂÓÔ×ÅÎÎÏ ÐÅÒÅÔÁÝÉÌ ÉÚ ÄÒÕÇÏÇÏ ÐÒÏÅËÔÁ) Ñ ×ÏÔ ÔÁËÏÊ ×ÏÔ ËÏÄ (ÎÉÖÅ). ïÄÉÎ ÒÁÚ ×ÙÚÙ×ÁÅÔÓÑ init_ADC(), ÐÏÔÏÍ ÎÁÐÒÉÍÅÒ ÐÏ ÐÒÅÒÙ×ÁÎÉÀ ÏÔ ÔÁÊÍÅÒÁ ÒÁÚ × ÍÉÌÌÉÓÅËÕÎÄÕ ×ÙÚÙ×ÁÅÔÓÑ get_ad(), ËÏÔÏÒÙÊ ÐÏÓÌÅÄÏ×ÁÔÅÌØÎÏ ËÁÎÁÌ ÚÁ ËÁÎÁÌÏÍ (ÐÏ ÏÄÎÏÍÕ ÎÁ ×ÙÚÏ×) ÏÐÒÁÛÉ×ÁÅÔ áãð É ÚÁÐÏÌÎÑÅÔ ÍÁÓÓÉ× ad_res[] ÏÔÆÉÌØÔÒÏ×ÁÎÎÙÍÉ ÚÎÁÞÅÎÉÑÍÉ ÍÅÄÌÅÎÎÏ ÍÅÎÑÀÝÉÈÓÑ ×ÅÌÉÞÉÎ. ÷ÏÐÒÏÓ × ÔÏÍ, ÞÔÏ ÐÏÞÅÍÕ-ÔÏ ÂÅÚ ÐÏÍÅÞÅÎÙÈ "??????????" ÄÅÊÓÔ×ÉÊ ÚÎÁÞÅÎÉÑ ÏËÁÚÙ×ÁÀÔÓÑ ÓÄ×ÉÎÕÔÙÍÉ ÎÁ 1. ôÏ ÅÓÔØ ÐÏ ÎÕÌÅ×ÏÍÕ ÉÎÄÅËÓÕ ÚÎÁÞÅÎÉÅ ÐÏÓÌÅÄÎÅÇÏ ËÁÎÁÌÁ, ÐÏ ÐÅÒ×ÏÍÕ - ÎÕÌÅ×ÏÇÏ, ÎÕ É ÔÁË ÄÁÌÅÅ. üÔÏ Ñ ÓÍÏÔÒÀ É ÎÅ ×ÉÖÕ ÞÅÇÏ-ÔÏ ÏÞÅ×ÉÄÎÏÇÏ, ÁÐÐÁÒÁÔÎÁÑ ÏÓÏÂÅÎÎÏÓÔØ (ÎÅ ÐÏÈÏÖÅ) ÉÌÉ ÏÛÉÂËÁ ÐÒÉ ËÏÍÐÉÌÑÃÉÉ (ÔÏÖÅ ÎÅ ÐÏÈÏÖÅ). ñ ÐÏÞÅÓÁÌ × ÇÏÌÏ×Å É ÐÒÏÄÏÌÖÉÌ ÄÁÌØÛÅ ÒÁÂÏÔÁÔØ, ÚÁÄÁÞÁ ÎÅ ÐÅÒÅÎÅÓÔÉ ÎÁ Mega32L ÐÒÏÇÒÁÍÍÕ, Á ÏÓ×ÏÉÔØ ÓÒÅÄÓÔ×Á ÒÁÚÒÁÂÏÔËÉ ÐÅÒÅÄ ÎÁÞÁÌÏÍ ÒÁÂÏÔÙ Ó ÎÏ×ÙÍ ÁÔÍÅÌÏ×ÓËÉÍ ËÒÉÓÔÁÌÌÏÍ, ËÏÔÏÒÁÑ ÎÁÞÎÅÔÓÑ ËÁË ÔÏÌØËÏ ÂÕÄÕÔ ÕÌÁÖÅÎÙ ÀÒÉÄÉÞÅÓËÉÅ ÆÏÒÍÁÌØÎÏÓÔÉ, ÎÏ ×ÏÐÒÏÓ ÏÓÔÁÌÓÑ.
úÁÏÄÎÏ É ÅÝÅ ÏÄÉÎ ×ÏÐÒÏÓ. ëÁË ÓËÁÚÁÔØ ËÏÍÐÉÌÑÔÏÒÕ × IDE ÞÔÏÂÙ ÏÎ ËÏÄ ×ÉÄÁ puts("Hello, World!"); ÎÅ ËÏÍÐÉÌÉÒÏ×ÁÌ ËÁË ËÏÎÓÔÁÎÔÎÕÀ ÓÔÒÏËÕ × ðúõ É ÕËÁÚÁÔÅÌØ ÎÁ ÎÅÅ × ïúõ.
____________types.h_________________________ typedef unsigned int WORD; typedef unsigned int word; typedef unsigned char BYTE; typedef unsigned char byte; ____________types.h_________________________
____________adc.h____________________________ #define ad_num 8 // channels #define _8BIT_
void init_ADC(void); void get_ad(); extern __no_init byte ad_res[]; /* AD average results */ extern __no_init byte ad_adj[]; /* AD adjustment values */ ____________adc.h____________________________
____________adc.c____________________________
// 8 bit ADC -> 8 bit low pass filtered
#define ENABLE_BIT_DEFINITIONS #include <iom32.h>
#include <types.h>
#include <ina90.h>
#include <ADC.h>
#define LPF
// Private variables __no_init static byte ad_ch; /* ADC channel */ __no_init static word ad_res_w[ad_num]; /* AD temporary values */
// Public variables __no_init byte ad_res[ad_num]; /* AD average results */ __no_init byte ad_adj[ad_num]; /* AD adjustment values */
void init_ADC(void) { register byte i;
ADMUX = (1<<REFS0)|(1<<ADLAR); ADCSRA = ((1<<ADEN)|6); // CLK/64 ad_ch = 0; #ifdef _8BIT_ ADMUX = 0x60; #else ADMUX = 0x40; #endif for(i = 0;i < ad_num; i++) { ad_res_w[i] = 0; ad_adj[i] = 128; } DDRA &= (byte)(255 << ad_num); }
/* AD measurement and average value calculation (low pass digital filter) */ /* one channel per call */
void get_ad() { #ifdef LPF word ad_tmp_w;
ADCSRA |= (1<<ADSC); //Start ADC while ((ADCSRA & (1<<ADSC)) == 1);
#ifdef _8BIT_ ad_tmp_w = (word)ADCH * 128U; // Scale AD value #else ad_tmp_w = (word)ADC * 32U; #endif
ad_res_w[ad_ch] += ((signed)(ad_tmp_w - ad_res_w[ad_ch]) / 16);
ad_res[ad_ch] = (byte)(((ad_res_w[ad_ch] /128) * ad_adj[ad_ch]) / 128); // * Scale outcome */
/* Select next channel */ if (++ad_ch == ad_num) ad_ch = 0;
#ifdef _8BIT_ if (ad_ch == ad_num - 1) ADMUX = 0x60; /* ?????????? */ else ADMUX = 0x60 | ad_ch+1; #else if (ad_ch == ad_num - 1) ADMUX = 0x40; else ADMUX = 0x40 | ad_ch+1; #endif
#else //LPF ADCSRA |= (1<<ADSC); while ((ADCSRA & (1<<ADSC)) == 1); ad_res[ad_ch] = ADCH; /* Select next channel */ if (++ad_ch == ad_num) ad_ch = 0; ADMUX = 0x60; #endif //LPF } ____________adc.c____________________________
ó Õ×ÁÖÅÎÉÅÍ, äÉÍÁ ïÒÌÏ×.