Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту

Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей...

 
Опции темы
Непрочитано 20.03.2012, 16:34  
r0st
Временная регистрация
 
Аватар для r0st
 
Регистрация: 24.11.2011
Адрес: Magdeburg
Сообщений: 81
Сказал спасибо: 10
Сказали Спасибо 16 раз(а) в 16 сообщении(ях)
r0st на пути к лучшему
По умолчанию Программирование АЦП. проблема с задержкой

Данная схема предназначается для задания ШИМ для управления двигателем и ПИ-регулирования. В качестве обратной связи используется аналоговый датчик тока, подключенный к одному из каналов АЦП.
Необходимо избежать скачков переключения, которые видны на графике (розовый цвет).

Atmega168 @ 20MHz, 20 kHz ШИМ

Задумка такова, чтобы измерять значение раз в 10-20 импульсов модуляции. При ШИМ ‹ ~50% мерить ток в середине отключенного времени в точке 1 (т.е. на спаде графика) и при ШИМ › 50% измерение производить в середине импульса (точка 2).
Проблема состоит в установке задержки измерения. Пробовал использовать тактовую частоту для этого (обработчик прерывания стоит в конце), но запутался с этим немного = не работает.

Может есть способ получше? Потому как целый день вожусь, ничего толком не добился...

Код:
#define ATMEGA168  1

#include "system.h"
#include "util/delay.h"
#define TERMINAL_PORT 0

char adc = 0;
char a,b;
char state = 0;
char i = 0;
char pwm = 0;

int main(void)
{

	SREG |= (1‹‹7);
	TIMSK0 |= (1‹‹OCIE0A);
	TCCR0A = (2‹‹COM0A0) | (1‹‹WGM01);
	TCCR0B = (1‹‹CS02) | (1‹‹CS01) | (1‹‹CS00);
	OCR0A = 200;

	USART_Init(19200, INT, 0);
	Terminal_Init(0);
//	ADC Aktivieren auf Kanal 0
	ADC_Init(REFEXTERN, 128, 1);
	ADC_Channel(SINGLE, 0, 0);

//	PWM Initialisierung
	PWM_Init_Timer1('A',8,FAST_PWM,124);
	DDRB |= (1‹‹DDB3);

	do
	{
		a=37+25;//+25*pwm*0.008;
		b=37;//+25*pwm*0.008;
		if (pwm › 62) 	state = 1;
		else			state = 0;

		ADC_Start(SINGLE);
		ADC_Finished();
		if (PWM_Get_Mode())
			{
			pwm = ADC_Get_Value()/8;
			}
		else pwm = PWM_Get_Value();

		a=62+25*pwm*0.008;
		b=37+25*pwm*0.008;
		if (pwm › 62) 	state = 1;
		else			state = 0;

		// Begrenzung auf 94,4% PWM
		if	( pwm ‹ 117)	PWM_Set_Timer1('A',pwm);
		else			PWM_Set_Timer1('A',117);


	}
	while(1);
	return 0;
}

ISR(TIMER0_COMPA_vect)
{
			Set('B',3);
			Clear('B',3);


			switch(state)
			{
			case 0:
				{
					Set('B',3);
					Clear('B',3);

					_delay_us(a);
//					while(i‹=1000)	i++;

					// Измерение тока в т.1
					Set('B',3);
					Clear('B',3);
					break;
				}
			case 1:
				{
					Set('B',3);
					Clear('B',3);
					_delay_us(b);
					// Измерение тока в т.2

					Set('B',3);
					Clear('B',3);
					break;
				};
			};

}
Миниатюры:
Нажмите на изображение для увеличения
Название: atmega.png
Просмотров: 62
Размер:	30.7 Кб
ID:	32919   Нажмите на изображение для увеличения
Название: SCR0031.PNG
Просмотров: 54
Размер:	24.9 Кб
ID:	32921  
Реклама:

Последний раз редактировалось r0st; 21.03.2012 в 15:12.
r0st вне форума  
Непрочитано 21.03.2012, 15:07  
r0st
Временная регистрация
 
Аватар для r0st
 
Регистрация: 24.11.2011
Адрес: Magdeburg
Сообщений: 81
Сказал спасибо: 10
Сказали Спасибо 16 раз(а) в 16 сообщении(ях)
r0st на пути к лучшему
По умолчанию Re: Программирование АЦП. проблема с задержкой

Пробовал использовать _delay_us(), но эта функция работает как-то неровно, прыгает все время, тем более что чтение аргумента, даже записанного предварительно в переменную отнимает около 280 микросекунд, при том, что один цикл ШИМ длится 50. Приведу осциллограмму. Желтый - ШИМ (спасибо, кэп!), синий - сигнал с PB3, устанавливающийся/сбрасывающийся функциями Set(), Clear(), каждая по 2 микросекунды. на графике показан результат когда аргументом является просто число.
Миниатюры:
Нажмите на изображение для увеличения
Название: SCR01.PNG
Просмотров: 47
Размер:	13.4 Кб
ID:	32942  

Последний раз редактировалось r0st; 21.03.2012 в 15:28.
r0st вне форума  
Непрочитано 21.03.2012, 15:17  
Easyrider83
Гуру портала
 
Аватар для Easyrider83
 
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 919
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
Easyrider83 на пути к лучшему
По умолчанию Re: Программирование АЦП. проблема с задержкой

Запустите преобразование по прерыванию таймера. По прерыванию готовности АЦП снимайте результат. На какую частоту таймер настроете, такую и получите.
Easyrider83 вне форума  
Непрочитано 21.03.2012, 15:26  
r0st
Временная регистрация
 
Аватар для r0st
 
Регистрация: 24.11.2011
Адрес: Magdeburg
Сообщений: 81
Сказал спасибо: 10
Сказали Спасибо 16 раз(а) в 16 сообщении(ях)
r0st на пути к лучшему
По умолчанию Re: Программирование АЦП. проблема с задержкой

Сообщение от Easyrider83 Посмотреть сообщение
Запустите преобразование по прерыванию таймера. По прерыванию готовности АЦП снимайте результат. На какую частоту таймер настроете, такую и получите.
т.е. задействовать третий таймер что ли? все равно мне нужно будет задавать его сдвиг каким то образом.
r0st вне форума  
Непрочитано 21.03.2012, 23:18  
_Артём_
Гражданин KAZUS.RU
 
Регистрация: 16.03.2011
Сообщений: 486
Сказал спасибо: 8
Сказали Спасибо 131 раз(а) в 116 сообщении(ях)
_Артём_ на пути к лучшему
По умолчанию Re: Программирование АЦП. проблема с задержкой

Сообщение от r0st Посмотреть сообщение
т.е. задействовать третий таймер что ли? все равно мне нужно будет задавать его сдвиг каким то образом.
Третьего таймера в м168 нет, есть 2-ой. Но он не годится: смысл совета - сделать источником запуска преобразования событие от таймера.
Для этого нужно настроить ADCSRB.ADTS: переполнение/совпадение от таймеров 0 или 1. Можете использовать тот же таймер что и для шима и читать результаты преобразования в прерывании по завершению АЦП.

PS. Странный код:
Сообщение от r0st Посмотреть сообщение
Set('B',3);
Clear('B',3);
_delay_us(a);
Set('B',3);
Clear('B',3);
break;
Делать задержку в прерывании на несколько десятков мкс, это плохая практика. Лучше читать результат преобразования на входе в прерывание и делать запуск следующего (это если не хотите пользоваться прерыванием от АЦП).
_Артём_ вне форума  
Непрочитано 22.03.2012, 01:02  
r0st
Временная регистрация
 
Аватар для r0st
 
Регистрация: 24.11.2011
Адрес: Magdeburg
Сообщений: 81
Сказал спасибо: 10
Сказали Спасибо 16 раз(а) в 16 сообщении(ях)
r0st на пути к лучшему
По умолчанию Re: Программирование АЦП. проблема с задержкой

Сообщение от _Артём_ Посмотреть сообщение
Третьего таймера в м168 нет, есть 2-ой.
Да, имелся в виду третий по счету, а не по номеру таймер.
Сделал программный счетчик импульсов и запускаю на каждом 20м такте ШИМ таймер0.
Вот тут возникла проблема - прерывание, связанное с этим таймером плывет по осциллограмме, хоть должно отстоять на заданном расстоянии от прерывания таймера1. Похоже я что-то неправильно делаю при запуске Т0...
Код:
#define ATMEGA168  1

#include "system.h"
#include "util/delay.h"
#define TERMINAL_PORT 0

char adc = 0;
double a,b;
char state = 0;
char i = 0;
char pwm = 0;
char count = 20;

int main(void)
{
	SREG |= (1‹‹7);
	TIMSK0 |= (1‹‹OCIE0A);
	TCCR0A |= (1‹‹WGM01);
	TCCR0B |= 0;
	OCR0A = 0;

	USART_Init(19200, INT, 0);
	Terminal_Init(0);
//	ADC Aktivieren auf Kanal 0
	ADC_Init(REFEXTERN, 128, 1);
	ADC_Channel(SINGLE, 0, 0);

//	PWM Initialisierung
	PWM_Init_Timer1('A',8,FAST_PWM,124);
	TIMSK1 |= (1‹‹TOIE1);
	DDRB |= (1‹‹DDB3);

	do
	{
		ADC_Start(SINGLE);
		ADC_Finished();
		if (PWM_Get_Mode())
			{
			pwm = ADC_Get_Value()/8;
			}
		else pwm = PWM_Get_Value();


		// Begrenzung auf 94,4% PWM
		if	( pwm ‹ 117)	PWM_Set_Timer1('A',pwm);
		else			PWM_Set_Timer1('A',117);

		a=120+pwm/2;
		b=pwm/2+182;
		if (pwm › 62) 	OCR0A = a;
		else			OCR0A = b;
	}
	while(1);
	return 0;
}

ISR(TIMER1_OVF_vect)
{
		if (count == 0)
		{
			TCCR0B = (1‹‹CS01);
			count=20;
		};
		count-=1;
		Set('B',3);
		Clear('B',3);
}

ISR(TIMER0_COMPA_vect)
{
	TCCR0B = 0;
	TCNT0=0;
	Set('D',3);
	Clear('D',3);
}
r0st вне форума  
Непрочитано 22.03.2012, 18:23  
r0st
Временная регистрация
 
Аватар для r0st
 
Регистрация: 24.11.2011
Адрес: Magdeburg
Сообщений: 81
Сказал спасибо: 10
Сказали Спасибо 16 раз(а) в 16 сообщении(ях)
r0st на пути к лучшему
По умолчанию Re: Программирование АЦП. проблема с задержкой

Все заработало по неведомым причинам - прошил сегодня снова и все функционирует как надо!) Так что буду разбираться с датчиком и плавно переходить к ПИ-регулированию.
r0st вне форума  
 

Закладки
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Программирование PIC АЦП в Proton IDE downkazus Микроконтроллеры, АЦП, память и т.д 7 06.12.2010 16:55
Программирование АЦП SFHK Микроконтроллеры, АЦП, память и т.д 11 16.10.2010 01:08
Программирование в ATSTK500 - Проблема. afand Микроконтроллеры, АЦП, память и т.д 1 14.12.2009 01:49
Проблема при программирование DMX512 esokol Информация по радиокомпонентам 0 31.10.2007 23:57
проблема с АЦП xelos Микроконтроллеры, АЦП, память и т.д 4 30.06.2005 21:20


Часовой пояс GMT +4, время: 09:49.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot