Чт авг 31, 2023 16:56:12
Чт авг 31, 2023 17:11:50
Чт авг 31, 2023 17:54:21
Чт авг 31, 2023 18:27:09
Чт авг 31, 2023 18:53:56
Чт авг 31, 2023 19:13:27
Чт авг 31, 2023 19:21:57
Чт авг 31, 2023 19:29:55
Чт авг 31, 2023 20:03:16
Чт авг 31, 2023 20:05:10
#define FIRST_ADC_INPUT 0
#define LAST_ADC_INPUT 2
volatile unsigned long adc[LAST_ADC_INPUT+1];
//********Voltage Reference: AVCC pin********************************************
unsigned int adc_data[LAST_ADC_INPUT-FIRST_ADC_INPUT+1];
// Voltage Reference: AVCC pin
#define ADC_VREF_TYPE ((0<<REFS1) | (1<<REFS0) | (0<<ADLAR))
ISR (ADC_vect)
{
static unsigned int cnt;
static uint8_t input_index=0;
static unsigned long adc_sum[LAST_ADC_INPUT+1]; //переменная для суммы значения ADC
// Read the AD conversion result
cnt++;
adc_data[input_index]=ADCW;
adc_sum[input_index]+= (unsigned long)adc_data[input_index]; // суммируем
// Select next ADC input
if (++input_index > (LAST_ADC_INPUT-FIRST_ADC_INPUT))
input_index=0;
ADMUX=(FIRST_ADC_INPUT | ADC_VREF_TYPE)+input_index;
// Delay needed for the stabilization of the ADC input voltage
_delay_us(10);
// Start the AD conversion
ADCSRA|=(1<<ADSC);
if (cnt >= (64*(LAST_ADC_INPUT+1))) { //если сделали 64 замера на каждый канал
for (uint8_t i=0; i<=LAST_ADC_INPUT; i++){
adc[i]=adc_sum[i];
adc_sum[i]=0;
}
cnt=0; //сбросили счетчик
adc_status=true; //подняли флаг, что очередная сумма замеров ГОТОВА
}
}
void ADC_Init(void){
//в этих расчетах у меня сомнения
//Время одного преобразования АЦП = 108,25uS
//T= ((11.5+2)/ADC Clk freq)+(4/F_CUP)=((11.5+2)/0,125)+(4/16)=0.00010825сек или 108,25uS
//где 11,5 для 10бит АЦП
//Двойка(2) - минимальное время захвата измеряемого напряжения в УВХ – 2 такта частоты CLK_ADC
// ADC Clock frequency: 125,000 kHz
// ADC Voltage Reference: AREF pin
// ADC Auto Trigger Source: ADC Stopped
ADMUX= FIRST_ADC_INPUT | ADC_VREF_TYPE;
ADCSRA=(1<<ADEN) | (1<<ADSC) |(1<<ADIE) | (1<<ADPS2) | (1<<ADPS1)| (1<<ADPS0);
}
int main(void){
ADC_Init();
while(1){
if(adc_status ){ //ждем окончания измерений ацп
for (uint8_t i=0; i<=LAST_ADC_INPUT; i++) {
adc[i]=adc[i]>>6;//сумму АЦП делим на 64
}
}
}//end while
}//end main
Чт авг 31, 2023 20:06:23
#include <avr/io.h>
void ADC_Init() {
ADMUX |= (1 << REFS0); // Set reference voltage to AVCC
ADCSRA |= (1 << ADPS2) | (1 << ADPS1); // Set ADC clock prescaler to 64 (125 kHz)
ADCSRA |= (1 << ADEN); // Enable ADC
}
uint16_t ADC_ReadChannel(uint8_t channel) {
ADMUX = (ADMUX & 0xF0) | (channel & 0x0F); // Set ADC channel
ADCSRA |= (1 << ADSC); // Start ADC conversion
while (ADCSRA & (1 << ADSC)); // Wait for conversion to complete
return ADC; // Return ADC value
}
int main(void) {
ADC_Init();
uint16_t adc_value1, adc_value2;
while (1) {
adc_value1 = ADC_ReadChannel(0); // Read ADC value from channel 0
adc_value2 = ADC_ReadChannel(1); // Read ADC value from channel 1
float voltage1 = (adc_value1 * 5000.0) / 1023.0; // Calculate voltage in millivolts for channel 0
float voltage2 = (adc_value2 * 5000.0) / 1023.0; // Calculate voltage in millivolts for channel 1
// Print ADC values and voltages to serial monitor or display
// You can use UART or any other communication method to send the values
}
}
Пт сен 01, 2023 09:40:21
Пт сен 01, 2023 11:31:20
Пт сен 01, 2023 12:09:19
Пт сен 01, 2023 12:21:58
Пт сен 01, 2023 12:30:01
Пт сен 01, 2023 12:43:07
Пт сен 01, 2023 12:46:59
Пт сен 01, 2023 14:45:17
kote52 писал(а):если ты по очередно замеры делаешь, adc0 потом adc1 потом adc2
uint16_t getsup(uint8_t count) //измерение напряжения питания
{
uint16_t result=0;
ADMUX=0b00001100; //питание как опорное, выравнивание вправо, измеряется 1,1 Вольт
for(uint8_t i=0; i<ADCFLUSHCOUNT; i++) {
ADCSRA|=0b01000000; //запуск для обновления УВХ
while(ADCSRA&0b01000000){};
};
for(uint8_t i=0; i<count;i++){
ADCSRA|=0b01000000; //запуск перобразования
while(ADCSRA&0b01000000){}; //ожидание окончания преобразования
result+=ADCW;
};
return result;
};
Вс сен 03, 2023 08:49:25