Страница 216 из 421

Re: CodeVision AVR в вопросах и ответах

Добавлено: Вт авг 21, 2012 11:11:06
Garin
AlexFisher как нет, в смысле нет и никогда не будет??? :)
А на ногу процессора в реальной схеме ставится стабилитрон 4.7 вольта, и все там ОК!
Есть вот такой исходник на 3х фазный мож кто поможет переделать под схему что я выложил ранее...
Спойлер

Код: Выделить всё

 // 1. АЦП на частоте 125 кГц цифрует сигнал. Обработчик прерывания Считает суммы отсчетов и их кол-во:
// ADC interrupt service routine
interrupt [ADC_INT] void adc_isr(void)
{
 dword adc_data, temp; 

 // Read the AD conversion result
 adc_data=ADCW&0xFFFE;

 if(isU)
 { // U
 temp=adc_data; //*adc_data;
 sqr_summU+=temp;
 countU++;
 } // if
 else
 { // I
 temp=adc_data; //*adc_data;
 sqr_summI+=temp;
 countI++;
 } // else
} // adc_isr

//2. Главная программа меряет по очереди ток и напряжение:

//.............
 // Измерение напряжения
 isU=1;
 sqr_summU=0;
 countU=0; 
 ADMUX&=0xFE; // ADC0 - канал напряжения
 // Запуск АЦП
 ADCSRA|=0x40; // ADCSC - Start ADC
 startMs=ms;
 // ожидание 21 мс (20мс - период 50 Гц)
 while (abs (ms-startMs)<21);
 // стоп АЦП
 ADCSRA&=0xBF; // 10111111 = BF
//.............

 //для тока также, только переменные другие. Переменная ms глобальная - TC1 по прерыванию считает миллисекунды.

//3. Когда оба померяли, вычисляем

 // Расчет напряжения
 // Среднеквадратическое
 // Urms=sqrt(sum(u(i)^2)/N); u(i) - мгновенные отсчеты (с АЦП), i=1..N
 f_sqr_summU = ((float)sqr_summU)/countU; // ср. арифм.
// f_sqr_summ=sqrt(f_sqr_summ); // Urms (отсчеты АЦП)

 // Uацп=ADC*Vref/1024=ADC*0.005
 U = f_sqr_summU*0.005;

 // Uвх=Urms*109.52
 U*=109.52;

 // Расчет тока
 // Среднеквадратическое
 // Urms=sqrt(sum(u(i)^2)/N); u(i) - мгновенные отсчеты (с АЦП), i=1..N
 f_sqr_summI = ((float)sqr_summI)/countI; // ср. арифм.
// f_sqr_summ=sqrt(f_sqr_summ); // Urms (отсчеты АЦП)

 // Uацп=ADC*Vref/1024=ADC*0.005
 I = f_sqr_summI*0.005;

 // Iн=500*Uацп/148,86 =Uацп*3.359
 I*=3.359;

 // S - Полная мощность 
 S_temp=((dword)I*U); 
 S=S_temp;    
}

Re: CodeVision AVR в вопросах и ответах

Добавлено: Вт авг 21, 2012 11:23:56
AlexFisher
Судя по исходнику, там 1 фаза, а не 3. Для измерения напряжения достаточно выбросить измерение тока, напряжение измеряется среднеквадратическое, соответствует ли это RMS - не знаю.

Вот, что у меня получилось, можете попробовать:
Спойлер

Код: Выделить всё

#include <mega8.h>

#include <delay.h>
// Declare your global variables here
volatile float U, f_sqr_summU;
volatile long sqr_summU, countU, N;
volatile unsigned char isU;

// External Interrupt 1 service routine
interrupt [EXT_INT1] void ext_int1_isr(void)
{
// Place your code here
  if (PIND.3)      //Фронт
  {
   isU=0;
   sqr_summU=0;
   countU=0;
   ADMUX&=0xFE; // ADC0 - канал напряжения
 // Запуск АЦП
   ADCSRA|=0x40; // ADCSC - Start ADC
  }
  else             //Спад
  {
    // стоп АЦП
   ADCSRA&=0xBF; // 10111111 = BF
    // Расчет напряжения
   // Среднеквадратическое
   // Urms=sqrt(sum(u(i)^2)/N); u(i) - мгновенные отсчеты (с АЦП), i=1..N
   f_sqr_summU = ((float)sqr_summU)/countU; // ср. арифм.
    // f_sqr_summ=sqrt(f_sqr_summ); // Urms (отсчеты АЦП)

   // Uацп=ADC*Vref/1024=ADC*0.005
   U = f_sqr_summU*0.005;

   // Uвх=Urms*109.52
   U*=109.52;
   isU=1;
 }
}

#define ADC_VREF_TYPE 0x40

// ADC interrupt service routine
interrupt [ADC_INT] void adc_isr(void)
{
 long adc_data, temp;

 // Read the AD conversion result
 adc_data=ADCW&0xFFFE;
 temp=adc_data; //*adc_data;
 sqr_summU+=temp;
 countU++;
}



void main(void)
{

// External Interrupt(s) initialization
// INT0: Off
// INT1: On
// INT1 Mode: Any change
GICR|=0x80;
MCUCR=0x04;
GIFR=0x80;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;

// ADC initialization
// ADC Clock frequency: 1000.000 kHz
// ADC Voltage Reference: AVCC pin
ADMUX=ADC_VREF_TYPE & 0xff;
ADCSRA=0x8B;

// Global enable interrupts
#asm("sei")

while (1)
      {
      // Place your code here
        if (isU)
        {
        //что-то делаем с измеренным напряжением
        } 
      }
}

Re: CodeVision AVR в вопросах и ответах

Добавлено: Вт авг 21, 2012 13:33:42
kras
Как пользоваться asm-компилятором в CV, писать на asm, возможно ли вообще это?

Re: CodeVision AVR в вопросах и ответах

Добавлено: Вт авг 21, 2012 13:45:31
Сериг
всем привет!нуждаюсь в помощи!атмега 328р,подскажите пожалуйста как оправшивать ADC5 и в зависимостиот напряжения подавать единичку на три порта т.е.вот так вот:
if adc 5 выдает больше 3 вольт,то PORTD5=1;больше 2.85 вольт,но меньше 3.0 вольт, PORTD.5=0;PORTD.6=1; и если меньше 2.85 вольт,то PORTD.5=0;PORTD.6=0:PORTD.7=1;
готов помочь вам деталями за помощь мне! спасибо!

Re: CodeVision AVR в вопросах и ответах

Добавлено: Вт авг 21, 2012 18:37:27
zero648
Сериг писал(а):всем привет!нуждаюсь в помощи!атмега 328р,подскажите пожалуйста как оправшивать ADC5 и в зависимостиот напряжения подавать единичку на три порта т.е.вот так вот:
if adc 5 выдает больше 3 вольт,то PORTD5=1;больше 2.85 вольт,но меньше 3.0 вольт, PORTD.5=0;PORTD.6=1; и если меньше 2.85 вольт,то PORTD.5=0;PORTD.6=0:PORTD.7=1;
готов помочь вам деталями за помощь мне! спасибо!
Сначала надо определиться с опорным напряжением, максимальный код АЦП будет равен опорному. Что собораетесь контролировать или измерять?

Re: CodeVision AVR в вопросах и ответах

Добавлено: Вт авг 21, 2012 20:11:21
vitalik_1984
kras писал(а):Как пользоваться asm-компилятором в CV, писать на asm, возможно ли вообще это?
Как такового асм компилятора нет, но есть возможность использовать асм куски кода.

Re: CodeVision AVR в вопросах и ответах

Добавлено: Вт авг 21, 2012 21:23:17
Garin
AlexFisher Собрал проект в протеусе,
Изображение
измерения делает но по какой логике мне чет совсем не понятно. (Архив этого проекта приложил к сообщению).
Вот еще одно описание алгоритма измерения нашел,
Во время прихода положительной полуволны запускается АЦП, Который успевает за время прохождения этой полуволны сделать порядка 100 выборок, которые обрабатываются по формуле:
Urms= sqrt(1/T* S[u(t)*u(t)]dt,
где: sqrt - корень квадратный, S - интеграл за период времени от 0 до Т.
Для дискретного способа взятия интеграла формула упроститься до вида
Urms=K*sqrt(1/N*sum(Uadc*Uadc)),
Где: К - поправочный коэффициент, Uadc - значение на выходе АЦП, N - число выборок за время прохождения полуволны синусоиды.
Но как это можно применить, для МК......

Re: Мелкие вопросы по МК и ПЛИС.

Добавлено: Вт авг 21, 2012 22:10:55
ZELENSKIY
Подскажите пожалуйста. :cry:
Я купил программатор AVR USBASP. Пытаюсь собрать простую схему мигания светодиодом.
Подключаю контроллер atmega8515 к программатору, стираю, прошиваю. Все проходит без
ошибок! Программа SinaProg. Выключаю, подключаю диод, питание и тишина!!!
Контроллер не выполняет никаких действий! Что это может быть???

Вот программа:
#include <mega8515.h>
#include <delay.h>
void main(void)
{

DDRC = 0b11111111;
PORTC = 0b00000000;
while(1)
{
PORTC.0=1; delay_ms(500);
PORTC.0=0; delay_ms(500);
}
}
Компилирую в CodeVisionAVR, Беру из папки .hex файл. Фьюзы не трогал!!!

Re: CodeVision AVR в вопросах и ответах

Добавлено: Ср авг 22, 2012 10:03:23
kras
Может кто-нибудь подробнее указать насчет процесса отладки в CV? Проект прокомпилился, хочу пройтись стрелочкой по коду, а мне на полпути пишет, чтобы я указал путь к AVR компилеру. И что делать?
А точнее невозможно выполнить \AVRStudio.exe

Re: CodeVision AVR в вопросах и ответах

Добавлено: Ср авг 22, 2012 10:47:46
urry
Да элементарно, Ватсон, только что Вы это написали.
Проще всего считать среднеквадратичное уже ВЫПРЯМЛЕННОГО переменного напряжения.
Пусть нас интересует частота 50 герц . Делаем выборки АЦП , скажем, ну пусть будет 128 выборок, с частотой 128*50.
После окончания этого процесса каждую из выборок возводим в квадрат и суммируем их.
Затем извлекаем квадратный корень из суммы.
Переводим наше значение в реальный вольтаж . Все...
Для случая невыпрямленного переменного немного сложнее, но не сильно.

Re: CodeVision AVR в вопросах и ответах

Добавлено: Ср авг 22, 2012 10:51:20
AlexFisher
Garin, Алгоритм расчета я взял из приведенного Вами кода и особо не вдумывался. Алгоритм измерения немного поменял - запуск и остановку оцифровки полупериода организовал по внешнему прерыванию (INT1) - настроил на срабатывание по любому уровню. В прерывании проверяется уровень (чтобы определить, спад это или фронт), если фронт - запускается АЦП, сбрасывается признак готовности, если спад - останавливается АЦП и производится расчет, после чего устанавливается признак готовности (он проверяется в основном цикле). Запуск и сотановка по прерыванию обеспечат наиболее точный вариант измерения.

Re: CodeVision AVR в вопросах и ответах

Добавлено: Ср авг 22, 2012 10:59:49
AlexFisher
kras писал(а):Может кто-нибудь подробнее указать насчет процесса отладки в CV? Проект прокомпилился, хочу пройтись стрелочкой по коду, а мне на полпути пишет, чтобы я указал путь к AVR компилеру. И что делать?
А точнее невозможно выполнить \AVRStudio.exe
Все просто. CV не имеет встроенного отладчика и пытается подключиться к внешнему, каковым и является AVR-studio. Если CV устанавливать после студии, то он сам ее находит и все гут. Если наоборот - нужно указать, где студия живет Изображение

Re: Мелкие вопросы по МК и ПЛИС.

Добавлено: Ср авг 22, 2012 11:03:39
Gudd-Head
ZELENSKIY писал(а):#include <mega8515.h>
#include <delay.h>
Я конечно не знаток СИ, но попробуйте добавить что-то вроде #define F_CPU 1E6 — задать тактовую частоту МК чтобы компилятор мог вычислить необходимые константы. 8515 с завода идёт с тактированием от встроенного 1 МГц RC генератора.

Re: Мелкие вопросы по МК и ПЛИС.

Добавлено: Ср авг 22, 2012 11:23:05
ZELENSKIY
Gudd-Head писал(а): Я конечно не знаток СИ, но попробуйте добавить что-то вроде #define F_CPU 1E6 — задать тактовую частоту МК чтобы компилятор мог вычислить необходимые константы. 8515 с завода идёт с тактированием от встроенного 1 МГц RC генератора.
Спасибо вечером попробую.
Интересно то, что на 0 порте висит единица. диод горит постоянно и не мигает может подключить внешний кварц?
Тоже думаю, что должен работать на 1 МГц я ничего не менял в настройках!

Re: Мелкие вопросы по МК и ПЛИС.

Добавлено: Ср авг 22, 2012 11:25:26
Gudd-Head
ZELENSKIY писал(а):может подключить внешний кварц?
МК бы не прошивался, если бы не тактировался.

Re: CodeVision AVR в вопросах и ответах

Добавлено: Ср авг 22, 2012 13:12:03
Сериг
zero648 писал(а):Сначала надо определиться с опорным напряжением, максимальный код АЦП будет равен опорному. Что собораетесь контролировать или измерять?
Буду изменять напряжение литиевой батарейки!
Максимальное напряжение которое может быть подано на вход ацп 3,3 вольта!
Огромное спасибо!

Re: CodeVision AVR в вопросах и ответах

Добавлено: Ср авг 22, 2012 15:14:24
kras
AlexFisher, прописал, путь к самому компилятору, а вроде там больше и нет exe, в итоге открывается компилятор, но пусто, ни проекта, ни тем более отладки.

Re: CodeVision AVR в вопросах и ответах

Добавлено: Ср авг 22, 2012 15:28:12
AlexFisher
kras писал(а):AlexFisher, прописал, путь к самому компилятору, а вроде там больше и нет exe, в итоге открывается компилятор, но пусто, ни проекта, ни тем более отладки.
Да. Это у них косяк (у студии) - она не хочет принимать имя файла параметром. Поэтому в "пустой" студии тупо открываем cof-файл проекта - и все начинает рулиться. Вплоть до эмуляции в Протеусе (только она глючная - не всегда открывается, но если откроется - работает нормально).

Re: CodeVision AVR в вопросах и ответах

Добавлено: Ср авг 22, 2012 18:20:08
vitalik_1984
Да она принимает, только не открывает файл, а принимает параметр папки, в которой можно поискать этот коф файл.
Так что искать долго не придется.
Может это и не в студии косяк.Кв ведь не знает, какой файл вы хотите запустить, может она не файл параметром передает, а папку?

Re: CodeVision AVR в вопросах и ответах

Добавлено: Ср авг 22, 2012 21:13:21
within
Ребята, как установить разрешение в 9 бит для DS18b20 в стандартной библиотеке?

Код: Выделить всё

devices=w1_init();
          if(devices>0)
           
          {Tnew=ds18b20_temperature(0);}  //читаем температуру  
          
          if (Tnew>1000){               //если датчик выдаёт больше 1000
             Tnew=4096-Tnew;            //отнимаем от данных 4096
             Tnew=-Tnew;                //и ставим знак "минус"
          }