phanis писал(а):Ну да, просто кнопками. В будущем планировал сделать имитатор турбинного счетчика жидкости.Если есть протеус, можно посмотреть работу в симуляторе.
Ага, посмотрел. спасибо, работае в протеусе..
(только для меня IAR незнаком...)
У меня есть программка, которая делает многоканальный ШИМ аппаратный.
Код: Выделить всё
#include<avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#define FIRST_ADC_INPUT 0x02 // первый канал АЦП, какой поставишь, напр, ADC0
#define LAST_ADC_INPUT 0x03 // последний канал АЦП, хоть 16-й.
unsigned int adc_data[LAST_ADC_INPUT-FIRST_ADC_INPUT];
#define ADC_VREF_TYPE 0x60 // регистр ADMUX, настройка опорного наряжения(тут от VCC)
//volatile long int_spedometr, f_spedometr;
//volatile long int_tahometr, f_tahometr;
#define out1 OCR3A //тут и далее в программе все, что в тексте out1 будет сделано для OCR3A
#define out2 OCR3B //аналогично можно ппродолжить и дальше , типа, out3, out4....
int main(void)
{
//порты на выход ШИМ. Конфигурируем порты контроллера
PORTE = 0;
DDRE = 0x18;
/* Настройка ШИМа на выходе. Для других контроллеров надо делать по своему. Здесь для Atmega1280 & 2560
Тут я скопировал значения для TCCR3n в TCCR4n и оно работает.) Тут регилирется частота ШИМ, вид.(фаст, с коррекц фазы и пр..)*/
TCCR3C = 0b10101001;
TCCR3B = 0b10100001;
TCCR3A = 0b10101001;
//TCCR4C = 0b10101001;
//TCCR4B = 0b10100001;
//TCCR4A = 0b10101001;
//Настройка АЦП
ADCSRA = (1<<ADEN)|(1<<ADSC)|(1<<ADATE)|(1<<ADIE)|(2<<ADPS0)|(1<<ADPS1)|(1<<ADPS0);
//дальше прерывания и прочее..Не особо в них шарю пока, объяснил бы кто, :)
sei();
//начало цикла перебора каналов
for(;;);
}
ISR(ADC_vect)
{
static unsigned char input_index=0;
// читаем результаты конвертации из ADCH в массив []
adc_data[input_index]=ADCH ;
// Select next ADC input
{if (++input_index > (LAST_ADC_INPUT-FIRST_ADC_INPUT))
input_index=0;
}
//..Цикл крутиться, каналы перебираются...Назначаем тут скока позволяет контроллер
//лишние ADC не надо активировать, а то наводка..
/*Присваивается значение массива значению счетчика */
out2 = adc_data[0]*0.25 ; // /0.3;//Меняя эти значения, изменяется скважность ШИМ.
out1 = adc_data[1];
//OCR3C = adc_data[2];
//OCR4A = adc_data[0];
//OCR4B = adc_data[1];
//OCR4C = adc_data[2];
// И т.д.
ADMUX=(FIRST_ADC_INPUT | (ADC_VREF_TYPE ) )+input_index;
_delay_us(60); // задержка, типа, чтобы успокоилось..ставил 20us, засветка крайних каналов, если ставить светодиоды.
ADCSRA|=0x40; //возобновление преобразования..
}
Познания мои в программировании оставляют желать лучшего, но пытаюсь, ))
Как бы Вы мне подсказали б , может в общих чертах, как их сопрягнуть..
Вопросы есть. Не получается с разной частотой сделать шим на , например, OCR1, (может и невозможно)
Задача , какжется, несложной..
.. Следуют импульсы (подается солярка) - горит огонь - термопара реагирует -
если в диапазоне - продолжаем с той же частотой импульсы +шим на вентилятор наддува.
Задали большую температуру - чаще импульсы - и так же меняется скважность для вентилятора
(опять же, термопара следит за температурой -если температура падает при увеличении импульсов, чуть меньше на вентилятор(он охлаждает )