МК должен управлять болгаркой (MK>db3>bt136= 0 -1250 об/мин)
-
clawham
- Поставщик валерьянки для Кота
- Сообщения: 1957
- Зарегистрирован: Пт окт 31, 2008 09:38:55
- Откуда: Одесса
- Контактная информация:
Re: МК должен управлять болгаркой (MK>db3>bt136= 0 -1250 об/
дык синхронизация тож ручная....развертка аналогично
ну если не хочет не надо и не будет он заниматься измерениями
экстрасенсы тут увы.....уехали....
Что нас не убило сделало нас осторожней
Не доверяйте русским лужам - это может быть вход в метро.
Не доверяйте русским лужам - это может быть вход в метро.
-
takei
- Нашел транзистор. Понюхал.
- Сообщения: 181
- Зарегистрирован: Пн янв 14, 2013 15:06:57
- Откуда: Д.Вс.
Re: МК должен управлять болгаркой (MK>db3>bt136= 0 -1250 об/
phanis писал(а):Еще для управления можно использовать (транзистор + диодный мост).
Использовать для схемы с DB3, или для схемы с МК?. Где можно увидеть схему такого использования?.
clawham практически убедил, что моя схема управления изврат юзера.
Я тоже не схематический экстрасенс, и не программный экстрасенс, свои вопросы я не могу обрисовать на пальцах и закидать весь этот форум терминологией специалиста-электронщика, я не увлечен здесь игрой разных умных слов, выложил полностью свой проект на первой странице форума, к большинству своих сообщений прикладываю скрины и схемы.
clawham писал(а):дык синхронизация тож ручная....развертка аналогичнону если не хочет не надо и не будет он заниматься измерениями
экстрасенсы тут увы.....уехали....
Что за измерения? нет у меня осциллографа, а делать из компьютера осциллограф не буду ... писал уже почему.
clawham вот между словесных поучений сделал же , программу деньгомер, отличная реальная вещь, за что спасибо.
В общем тут кто про что , осциллограф у меня пока только один... в протеусе.
И я пока не знаю, как сделать управляющий сигнал на симистор (зеленая линия) ,импульсным...
Сейчас так
а вот так нужно попытаться сделать
Мой проект все там же, на первой странице.
-
clawham
- Поставщик валерьянки для Кота
- Сообщения: 1957
- Зарегистрирован: Пт окт 31, 2008 09:38:55
- Откуда: Одесса
- Контактная информация:
Re: МК должен управлять болгаркой (MK>db3>bt136= 0 -1250 об/
ну это же элементарно Ватсон!
было так а сделать нужно
вот так...если тиристор не открывается - просто добавь нопов
копи пастом 
Код: Выделить всё
interrupt [TIM1_COMPA] void timer1_compa_isr(void)
{
TTT_PIN = 1;
GIFR|=(1<<6); // сбросили флаг прерывания - Флаг сбрасывается ЕДИНИЦЕЙ
GICR|=(1<<6);
OCR1A = procent;
}было так а сделать нужно
Код: Выделить всё
interrupt [TIM1_COMPA] void timer1_compa_isr(void)
{
TTT_PIN = 1;
GIFR|=(1<<6); // сбросили флаг прерывания - Флаг сбрасывается ЕДИНИЦЕЙ
GICR|=(1<<6);
OCR1A = procent;
#asm("nop");
#asm("nop");
#asm("nop");
#asm("nop");
#asm("nop");
#asm("nop");
TTT_PIN = 0;
}
вот так...если тиристор не открывается - просто добавь нопов
Что нас не убило сделало нас осторожней
Не доверяйте русским лужам - это может быть вход в метро.
Не доверяйте русским лужам - это может быть вход в метро.
-
takei
- Нашел транзистор. Понюхал.
- Сообщения: 181
- Зарегистрирован: Пн янв 14, 2013 15:06:57
- Откуда: Д.Вс.
Re: МК должен управлять болгаркой (MK>db3>bt136= 0 -1250 об/
Действительно элементарно...
(только ж, у меня ведь тяжелый случай))))))))

Сделал копи пастом 70 штук "nop" и все стало ОК.
Только, наверное 70 это сильно, может есть метод задать эти 21 mS программно в цифровом значении?
Спасибо.
P.S. сейчас моя монтажка на проводках распалась на проводки...).((((
Надо мне будет заняться и вытравить постоянную платку, испытаю в железе отпишусь
Сделал копи пастом 70 штук "nop" и все стало ОК.
Только, наверное 70 это сильно, может есть метод задать эти 21 mS программно в цифровом значении?
Спасибо.
P.S. сейчас моя монтажка на проводках распалась на проводки...).((((
Надо мне будет заняться и вытравить постоянную платку, испытаю в железе отпишусь
- Вложения
-
- 21.JPG
- (33.11 КБ) 1540 скачиваний
- zero648
- Вымогатель припоя
- Сообщения: 650
- Зарегистрирован: Пн июн 18, 2012 12:01:04
- Откуда: Челябинская область, Копейск
Re: МК должен управлять болгаркой (MK>db3>bt136= 0 -1250 об/
takei вставь асемблерную вставку, я правда не знаю как на С она вставляется, по крайней мере она компактней нопов
Код: Выделить всё
ldi r16,200
loop_no_zero:
dec r16
brne loop_no_zero
Re: МК должен управлять болгаркой (MK>db3>bt136= 0 -1250 об/
Задержка внутри прерывания - нонсенс. Я делал по-другому. Вот часть исходника, который я здесь выкладывал:
Код: Выделить всё
// Timer 0 output compare A interrupt service routine
interrupt [TIM0_COMPA] void timer0_compa_isr(void)
{
// сюда попадаем, когда таймер досчитал до OCR0A
// формируем импульс включения симистора, равный одному периоду входной частоты таймера - примерно 50 мкс
//PORTB.4 = 1; // для отладки
if(PINB.3)
{
// импульс ещё не начал формироваться
PORTB.3 = 0; // начинаем формировать импульс включения симистора
PORTB.0 = 1; // начинаем формировать импульс ШИМ
OCR0A++; // увеличиваем OCR0A на единицу, чтобы попасть в это же самое прерывание на следующем такте
// таймера. В дальнейшем, прежнее значение OCR0A восстанавливать не надо, т.к. оно задаётся
// в начале каждого полупериода
}
else
{
// импульс включения симистора уже формируется
PORTB.3 = 1; // закончили формировать
}
//PORTB.4 = 0; // для отладки
}-
clawham
- Поставщик валерьянки для Кота
- Сообщения: 1957
- Зарегистрирован: Пт окт 31, 2008 09:38:55
- Откуда: Одесса
- Контактная информация:
Re: МК должен управлять болгаркой (MK>db3>bt136= 0 -1250 об/
можно и так...но задержка в 2 микросекунды в прерывании абсолютно допустима если не используется никаких программных времязависимых протоколов или задач + если сама задержка не является функцией с параметрами...
70 тактов простоя это много...там у Вас уже есть тактов 10-15 между взведением единички и концом прерывания....потому нужно просто посчитать длительность одного машинного такта и вычитать в даташите время минимальное для пробития по управлению...у вашего вродебы 2 микросекунды... при тактовой 8 мегагерц это 8 тактов на микросекунду.....выждите 20-30 нопов и всё
от этого никому не станет ни плохо ни хорошо.....а вот если на единичку инкрементировать сравнение - начнутся проблемы на минимальной мощности...когда симистор надо будет выключить через прерывание а оно уже в начале новой полуволны....ибо выход и вход в прерывание это гораздо больше чем 2 микросекунды
70 тактов простоя это много...там у Вас уже есть тактов 10-15 между взведением единички и концом прерывания....потому нужно просто посчитать длительность одного машинного такта и вычитать в даташите время минимальное для пробития по управлению...у вашего вродебы 2 микросекунды... при тактовой 8 мегагерц это 8 тактов на микросекунду.....выждите 20-30 нопов и всё
Что нас не убило сделало нас осторожней
Не доверяйте русским лужам - это может быть вход в метро.
Не доверяйте русским лужам - это может быть вход в метро.
-
takei
- Нашел транзистор. Понюхал.
- Сообщения: 181
- Зарегистрирован: Пн янв 14, 2013 15:06:57
- Откуда: Д.Вс.
Re: МК должен управлять болгаркой (MK>db3>bt136= 0 -1250 об/
Спасибо ребята за толковые подсказки (жалею только, что так быстро распсиховался и раскидал экспериментальную монтажку с этой схемой, не могу сразу опробовать это в железе(((((()
Дело пока пошло на лад не терпится пробовать усе в железе.
Вот уж не ожидал,..... что могу воспользоватся асемблерной вставкой (так как, не имею реального понятия что это такое)
В средствах отладки это выглядит , компактно и изумительно
с этой вставкой задержка аж 155 mS, не знаю насколько будет логично это применение с другими программными функциями ( не хочется торопить события без испытания в железе)))).
По крайней мере в протеусе при выставленном (минимально) значении ldi r16,30 длина импульса 25mS, симуляция проходит нормально.
Дело пока пошло на лад не терпится пробовать усе в железе.
Вот уж не ожидал,..... что могу воспользоватся асемблерной вставкой (так как, не имею реального понятия что это такое)
Код: Выделить всё
interrupt [TIM1_COMPA] void timer1_compa_isr(void)
{
TTT_PIN = 1;
GIFR|=(1<<6); // сбросили флаг прерывания - Флаг сбрасывается ЕДИНИЦЕЙ
GICR|=(1<<6);
OCR1A = procent;
#asm
ldi r16,200
loop_no_zero:
dec r16
brne loop_no_zero
#endasm
TTT_PIN = 0;
}В средствах отладки это выглядит , компактно и изумительно
с этой вставкой задержка аж 155 mS, не знаю насколько будет логично это применение с другими программными функциями ( не хочется торопить события без испытания в железе)))).
По крайней мере в протеусе при выставленном (минимально) значении ldi r16,30 длина импульса 25mS, симуляция проходит нормально.
-
clawham
- Поставщик валерьянки для Кота
- Сообщения: 1957
- Зарегистрирован: Пт окт 31, 2008 09:38:55
- Откуда: Одесса
- Контактная информация:
Re: МК должен управлять болгаркой (MK>db3>bt136= 0 -1250 об/
не путайте пожалуйста милли и МИКРО секунды!!!
Миллисекунда это 1/1000 секунды - 1 килогерц - 1 mS
МИКРОсекунда это 1/1000000 секунды - 1 МЕГАгерц - 1 uS
Нам с Вашим симистором НАДО всего лишь 2 МИКРОсекунды чтоб открыться.....для надежности можно взять в 3-4 раза бОльшее значение - 5-8 МИКРОсекунд...
Если у Вас мега 8 то одна МИКРОсекунда порождает 8 тактов (ну +-)
у Вас уже есть 12 тактов прерывания .... надбавьте ещё 32-12 НОПа и хватит....использовать вставки очень опасно!!! компилятор не сохраняет использованный Вами регистр ибо он не используется в прерывании(Сишной его части) - потому если где-то в программе он будет использоваться и тут произойдёт прерывание - вы его запортите! да и не нужно этого....Вам не 2000 тактов надо пропустить...всего 20....
Кроме того....что за хиленький симисторчик-то? 4 ампера это мизер!!!! не намного дороже зато неубиваемые....термоядерные...скоростные....
я закупился BTA24-600CWRG - 25 ампер 600 вольт, Изолированная подложка!!!!!
Миллисекунда это 1/1000 секунды - 1 килогерц - 1 mS
МИКРОсекунда это 1/1000000 секунды - 1 МЕГАгерц - 1 uS
Нам с Вашим симистором НАДО всего лишь 2 МИКРОсекунды чтоб открыться.....для надежности можно взять в 3-4 раза бОльшее значение - 5-8 МИКРОсекунд...
Если у Вас мега 8 то одна МИКРОсекунда порождает 8 тактов (ну +-)
у Вас уже есть 12 тактов прерывания .... надбавьте ещё 32-12 НОПа и хватит....использовать вставки очень опасно!!! компилятор не сохраняет использованный Вами регистр ибо он не используется в прерывании(Сишной его части) - потому если где-то в программе он будет использоваться и тут произойдёт прерывание - вы его запортите! да и не нужно этого....Вам не 2000 тактов надо пропустить...всего 20....
Кроме того....что за хиленький симисторчик-то? 4 ампера это мизер!!!! не намного дороже зато неубиваемые....термоядерные...скоростные....
я закупился BTA24-600CWRG - 25 ампер 600 вольт, Изолированная подложка!!!!!
Что нас не убило сделало нас осторожней
Не доверяйте русским лужам - это может быть вход в метро.
Не доверяйте русским лужам - это может быть вход в метро.
-
takei
- Нашел транзистор. Понюхал.
- Сообщения: 181
- Зарегистрирован: Пн янв 14, 2013 15:06:57
- Откуда: Д.Вс.
Re: МК должен управлять болгаркой (MK>db3>bt136= 0 -1250 об/
Барсик писал(а):..Исходник к схеме download/file.php?id=133950 в прикошаченном файле. .....
Барсик прошу прощения что оставил ваш пост без внимания, с интересом попытался разобраться , но там хоть и откомментирована каждая строка, я не смог вникнуть в структуру программы.
Честно говоря я не осилил подобное и в еще одном варианте исходника на tiny13
Пытался переложить на мегу8 ... не осилил ,
clawham писал(а):у Вас уже есть 12 тактов прерывания .... надбавьте ещё 32-12 НОПа и хватит....использовать вставки очень опасно!!! компилятор не сохраняет использованный Вами регистр ибо он не используется в прерывании(Сишной его части) - потому если где-то в программе он будет использоваться и тут произойдёт прерывание - вы его запортите! да и не нужно этого....Вам не 2000 тактов надо пропустить...всего 20....
clawham ваш одесский юмор не всегда могу уловить, уже все было красиво и идеально..... (шутка)
Спасибо принял к сведению. Пока не добрался до испытаний в натуре, при испытаниях начну с вставок ноп.
Вот очевидно есть еще вариант без использования вставок, но с использованием двух таймеров.
Как то так.
Код: Выделить всё
interrupt [EXT_INT0] void ext_int0_isr(void)
{
OCR1A = procent;
OCR1B = procent+60;
TCNT1 = 0; // сбросили таймер
GICR&=~(1<<6); // запретили прерывание INT0 // GIFR = 0x10000000
}использовано отсюда radiokot.ru/forum/
Спойлер
Код: Выделить всё
/*****************************************************
This program was produced by the
CodeWizardAVR V2.03.4 Standard
Automatic Program Generator
© Copyright 1998-2008 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com
Project :
Version :
Date : 10.10.2010
Author :
Company :
Comments:
Chip type : ATmega8
Program type : Application
Clock frequency : 16,000000 MHz
Memory model : Small
External RAM size : 0
Data Stack size : 256
*****************************************************/
#include <mega8.h>
#include <delay.h>
#include <spi.h>
#include <string.h>
#include <stdio.h>
#include <ds1307_twi.h>
#include <bcd.h>
#include <lcd.c>
#define delay_ 30 // плавность включения
#define TRIAC_PIN PORTD.4 // пин управления симистором
#define power_x 25 // координаты расположения мощности
#define power_y 40 // на дисплее
int status = 0; // текущее значение яркости
unsigned int tick = 0; //счетчик тиков таймера
unsigned char b_cnt = 0; //счетчик принятых бит
bit start_cond = 0; //флаг стартового условия
bit start_triac_timer = 0;
volatile unsigned char addr_1 = 0; //прямой байт адреса
volatile unsigned char addr_0 = 0; //инверсный байт адреса
volatile unsigned char cmd_1 = 0; //прямой байт команды
volatile unsigned char cmd_0 = 0; //инверсный байт команды
volatile unsigned char cmd = 0; //байт команды
unsigned char hour,min,sec; //часы, минуты, секунды
unsigned char day,month,year; //день, месяц, год
char cnt[]; // промежуточная переменная для функции sprint()
long int count_RTC = 0;
// строки для примера
//char txt1[]="19:42";
// Таблица задержек для 16-тибитного таймера
flash const unsigned int nagruzka[99] = {
20324, // 1% нагрузки
19794, // 2% нагрузки
19384, // 3% нагрузки
19036,18728,18450,18190,17948,17720,17504,17296,17096,16904,16718,16536,16360,16188,16022,15858,15696,
15538,15384,15232,15082,14934,14788,14644,14500,14360,14220,14082,13944,13808,13674,13540,13406,13274,13142,
13012,12882,12752,12622,12494,12366,12238,12110,11982,11854,11728,11600,11472,11346,11218,11090,10962,10834,
10706,10578,10448,10318,10188,10058,9926,9794,9660,9526,9392,9256,9118,8980,8840,8700,8556,8412,8266,8118,
7968,7816,7662,7504,7342,7178,7012,6840,6664,6482,6296,6104,5904,5696,5480,5252,5010,4750,4472,4164,
3816, // 97% нагрузки
3406, // 98% нагрузки
2876 // 99% нагрузки
};
// External Interrupt 0 service routine
// External Interrupt 0 service routine
interrupt [EXT_INT0] void ext_int0_isr(void)
{
if (start_triac_timer == 1) {
OCR1A = nagruzka[status];
OCR1B = nagruzka[status]+60;
TCNT1 = 0; // сбросили таймер
TCCR1B=0x02;
GICR&=~(1<<6); // запретили прерывание INT0 // GIFR = 0x10000000
}
else {
TCCR1B=0x00;
}
}
// External Interrupt 1 service routine
interrupt [EXT_INT1] void ext_int1_isr(void)
{
TCNT0=0xFA; // запускаем таймер на 96 мкс
TCCR0=0x04; // частота таймера 62.500 кГц
if (tick >= 90 && tick < 98) //если прошло от 8,64 мс до 9,408 мс
{
start_cond = 1; //фиксируем стартовое условие
addr_1 = addr_0 = cmd_1 = cmd_0 = 0; //обнуляем ранее полученную команду и адрес
}
if (tick >= 20 && tick < 27 && start_cond) //если прошло от 1,92 мс до 2,592 мс
{
b_cnt++; //приняли "1" и увеличили счетчик битов
if (b_cnt < 9) addr_1 = (addr_1 << 1) + 1; //первый байт - прямой адрес
if (b_cnt >= 9 && b_cnt < 17) addr_0 = (addr_0 << 1) + 1; //второй байт - инверсный адрес
if (b_cnt >= 16 && b_cnt < 25) cmd_1 = (cmd_1 << 1) + 1; //третий байт - прямая команда
if (b_cnt >= 24) cmd_0 = (cmd_0 << 1) + 1; //четвертый байт - инверсная команда
}
if (tick >= 9 && tick < 16 && start_cond) //если прошло от 0,864 мс до 1,536 мс
{
b_cnt++; //приняли "0" и увеличили счетчик битов
if (b_cnt < 9) addr_1 = (addr_1 << 1); //далее - аналогично по байтам
if (b_cnt >= 9 && b_cnt < 17) addr_0 = (addr_0 << 1);
if (b_cnt >= 16 && b_cnt < 25) cmd_1 = (cmd_1 << 1);
if (b_cnt >= 24) cmd_0 = (cmd_0 << 1);
}
tick = 0; //обнулили тики
if (b_cnt == 32) //если приняли уже 4 байта
{
// if ((addr_1+addr_0) == 0xFF) addr = addr_0; //закомментировано, потому что нам
// else addr = 0; //необходима только команда
if ((cmd_1 + cmd_0) == 0xFF) { //проверили правильность приема команды
cmd = cmd_1;
b_cnt = 0; //обнулили счетчик битов
start_cond = 0; //сбросили стартовое условие
}
else {
cmd = 0;
b_cnt = 0; //обнулили счетчик битов
start_cond = 0; //сбросили стартовое условие
TCCR0=0x00; //остановили таймер
TCNT0=0x00;
}
}
}
// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
TCNT0=0xFA; //переинициировали таймер - отсчитывает 96 мкс
tick++; //увеличили число тиков
if (tick > 500) { //если прошло более 48 мс
TCCR0=0x00; //сбросили все к исходному состоянию
TCNT0=0x00;
tick = 0;
start_cond = 0;
cmd = 0;
}
}
// Timer 1 output compare A interrupt service routine
interrupt [TIM1_COMPA] void timer1_compa_isr(void)
{
TRIAC_PIN = 0; // открыли симистор
}
// Timer 1 output compare B interrupt service routine
interrupt [TIM1_COMPB] void timer1_compb_isr(void)
{
TRIAC_PIN = 1; // вернулись в режим ожидания
GIFR|=(1<<6); // сбросили флаг прерывания - Флаг сбрасывается ЕДИНИЦЕЙ
GICR|=(1<<6); // разрешаем прерывание INT0.
}
/*===== ФУНКЦИЯ ПЛАВНОГО ВКЛЮЧЕНИЯ =======*/
void soft_on () {
TCCR1B=0x02;
while (status<98) {
status++;
delay_ms(delay_);
sprintf(cnt,"%u",status); // преобразование "яркости" в строку
put_string(power_x, power_y,cnt, 0x07E0, 3); // выводим на экран
};
status = 98;
TCCR1B=0x00;
TRIAC_PIN = 0; // полностью включили
}
/*============ ФУНКЦИЯ ПЛАВНОГО ВЫКЛЮЧЕНИЯ С ТЕКУЩЕЙ ЯРКОСТИ =================*/
void soft_off () {
TCCR1B=0x02;
while (status>0) {
status--;
delay_ms(delay_);
sprintf(cnt,"%u",status); // преобразование "яркости" в строку
put_string(power_x, power_y,cnt, 0x07E0, 3); // выводим на экран
}
status = 0;
TCCR1B=0x00;
TRIAC_PIN = 1; // полностью выключили
}
/*======= ВКЛЮЧЕНИЕ ЧАСОВ DS1307 ========*/
void DS1307_on () {
unsigned char tmp;
tmp = rtc_read(0x00);
tmp &=~(1<<7);
rtc_write(0x00, tmp); //включение DS1307, бит 7 ноль
tmp = rtc_read(0x02);
tmp &=~(1<<6);
rtc_write(0x02, tmp); // бит 6 ноль - 24ох часовой режим
}
void main(void)
{
// Input/Output Ports initialization
// Port B initialization
// Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out
// State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0
PORTB=0x00;
DDRB=0xFF;
// Port C initialization
// Func6=Out Func5=In Func4=In Func3=Out Func2=Out Func1=Out Func0=Out
// State6=0 State5=T State4=T State3=0 State2=0 State1=0 State0=0
PORTC=0x00;
DDRC=0x4F;
// Port D initialization
// Func7=In Func6=In Func5=In Func4=Out Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=1 State3=P State2=P State1=T State0=T
PORTD=0x1C;
DDRD=0x10;
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
TCCR0=0x00;
TCNT0=0x00;
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 2000,000 kHz
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: On
// Compare B Match Interrupt: On
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer 2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
// External Interrupt(s) initialization
// INT0: On
// INT0 Mode: Falling Edge
// INT1: On
// INT1 Mode: Falling Edge
GICR|=0xC0;
MCUCR=0x0A;
GIFR=0xC0;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x19;
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;
// SPI initialization
// SPI Type: Master
// SPI Clock Rate: 2*4000,000 kHz
// SPI Clock Phase: Cycle Half
// SPI Clock Polarity: Low
// SPI Data Order: MSB First
SPCR=0x50;
SPSR=0x01;
// 2 Wire Bus initialization
// Generate Acknowledge Pulse: On
// 2 Wire Bus Slave Address: 68h
// General Call Recognition: Off
// Bit Rate: 100,000 kHz
TWSR=0x00;
TWBR=0x48;
TWAR=0xD0;
TWCR=0x44;
// Global enable interrupts
#asm("sei")
LCD_init();
fill_screen(bgcolor);
//rtc_write(0x02,rtc_read(0x02)&~0x40); // установили 24 часовой формат (бит 6 регистра 0х02 равен 0)
//rtc_write(0x00,rtc_read(0x00)&~0x80); // включили часы (бит 7 регистра 0х00 ранен 0)
DS1307_on ();
rtc_init (0,0,0);
//rtc_set_time (bin2bcd(20),bin2bcd(47),bin2bcd(12));
//rtc_set_date (bin2bcd(17),bin2bcd(03),bin2bcd(11));
//put_string(50, 0,txt1, 0xF800, 2);
sprintf(cnt,"%u",status); // преобразование "яркости" в строку
put_string(power_x, power_y,cnt, 0x07E0, 3); // выводим на экран
while (1)
{ count_RTC++;
/*==================== РЕАКЦИЯ НА НАЖАТИЕ КЛАВИШ ВЫКЛЮЧАТЕЛЯ ================*/
/*if (PINB.0==0) { // ждем нажатие клавиши выключателя
delay_ms(50); // антидребезг
if (status==0) {
TCCR1B=0x02; // запуск таймера на 2000 кГц
soft_on (98); // плавно от 1% до 99% мощности
TCCR1B=0x00; // остановка таймера ( чтобы не молотил в пустую 200 мкс импульсы на PORTC.5 )
PORTC.5 = 1; // 100%
status = 98;
}
else {
TCCR1B=0x02;
soft_off(status); // плавно выключаем с текущей мощности
TCCR1B=0x00;
PORTC.5 = 0; // 0%
status=0;
};
}*/
/*if (PINB.5==0) { // вкл/выкл основного света
// реле вкл/выкл
}*/
/*===== УВЕЛИЧЕНИЕ/УМЕНЬШЕНИЕ ЯРКОСТИ =====================*/
if (cmd == 0b11111000) { // кнопка "Display" - увеличение яркости
TCCR1B=0x02;
status++;
if (status > 97) {
TCCR1B=0x00;
status = 98;
TRIAC_PIN = 0; // полностью включили
sprintf(cnt,"%u",status); // преобразование "яркости" в строку
put_string(power_x, power_y,cnt, 0x07E0, 3); // выводим на экран
}
else {
sprintf(cnt,"%u",status); // преобразование "яркости" в строку
put_string(power_x, power_y,cnt, 0x07E0, 3); // выводим на экран
delay_ms(delay_);
}
}
if (cmd == 0b11000000) { // кнопка "Sleep" - уменьшение яркости
TCCR1B=0x02;
status--;
if (status < 1) {
status = 0; // чтобы не уйти в минус
TCCR1B=0x00;
TRIAC_PIN = 1; // полностью выключили
sprintf(cnt,"%u",status); // преобразование "яркости" в строку
put_string(power_x, power_y,cnt, 0x07E0, 3); // выводим на экран
}
else {
sprintf(cnt,"%u",status); // преобразование "яркости" в строку
put_string(power_x, power_y,cnt, 0x07E0, 3); // выводим на экран
delay_ms(delay_);
}
}
/*=================== ВКЛЮЧЕНИЕ/ВЫКЛЮЧЕНИЕ С ПУЛЬТА ====*/
if (cmd == 0b11011000) { // кнопка "TV" - вкл/выкл диммера
GICR&=~(1<<7); // запретили прерывание INT1 (от TSOP) // GIFR = 0x01000000
if (status == 0) {
soft_on (); // 100% мощности
}
else {
soft_off(); // плавно выключаем
};
GIFR|=(1<<7); // сбросили флаг прерывания - Флаг сбрасывается ЕДИНИЦЕЙ
GICR|=(1<<7); // разрешаем прерывание INT1
}
if (cmd == 0b10000000) { // кнопка "VIDEO" - вкл/выкл основного света
// реле вкл/выкл
LCD_PowerOff ();
}
if (count_RTC > 100000) { // чтобы не опрашивать DS1307 слишком часто
count_RTC = 0;
rtc_get_time(&hour,&min,&sec); //считать время
rtc_get_date(&day,&month,&year); //считать дату
sec = bcd2bin(sec);
min = bcd2bin(min);
hour = bcd2bin(hour);
day = bcd2bin(day);
month = bcd2bin(month);
year = bcd2bin(year);
sprintf(cnt,"%02u:%02u:%02u",hour,min,sec);
put_string(10, 10,cnt, 0x07E0, 1);
sprintf(cnt,"%02u.%02u.20%02u",day,month,year);
put_string(10, 100,cnt, 0x07E0, 1);
}
};
}
Мое понимание этой части кода, "вроде понятно" не приводит к положительному результату в моем коде.
- count_raven
- Первый раз сказал Мяу!
- Сообщения: 21
- Зарегистрирован: Пн мар 12, 2012 22:24:32
- Откуда: нижегородская область
- Контактная информация:
Re: МК должен управлять болгаркой (MK>db3>bt136= 0 -1250 об/
http://www.cncmasterkit.ru/viewtopic.php?f=3&t=1409 вот здесь готовый проект, контроллер шпинделя
Re: МК должен управлять болгаркой (MK>db3>bt136= 0 -1250 об/
Работает так. По прерыванию в начале каждого полупериода сетевого напряжения, запускается таймер. Как только таймер досчитает до OCR0A, включается симистор.takei писал(а):Барсик прошу прощения что оставил ваш пост без внимания, с интересом попытался разобраться , но там хоть и откомментирована каждая строка, я не смог вникнуть в структуру программы.
Настроено прерывание от аналогового компаратора по изменению состояния входа. Изменение происходит в начале каждого полупериода сетевого напряжения - каждые 10 миллисекунд. Соответственно, прерывания происходят в начале каждого полупериода сетевого напряжения. Таймер пересчитывает тактовую частоту микроконтроллера. В качстве тактового генератора выбран внутренний генератор микроконтроллера. Тактовая частота и прескалер выбраны так, чтобы за 10 миллисекунд таймер насчитывал бы 100 - 200. В даном случае, он насчитывает примерно 187. Почему "примерно"? А потому, что точность частоты внутреннего генератора +/- 10%, а точность частоты сетевого напряжения гораздо выше. Сколько насчитал таймер за полупериод - столько получится дискретных значений для угла открывания симистора.
По прерыванию от аналогового компаратора в начале каждого полупериода сетевого напряжения происходит следующее:
1. Измеряется точное значение - half_period_time - сколько насчитал таймер за полупериод.
2. Таймер сбрасывается в ноль.
3. Задаётся новое значение OCR0A - угол открывания симистора.
4. Запрещается прерывание от аналогового компаратора.
Кроме этого, прерывание используется для отсчёта реальнго времени в функции временной задержки, и формирования импульсов ШИМ для индикации (с помощью стрелочного микроамперметра) угла отпирания симистора.
Настроено прерывание от таймера по совпадению с OCR0A. При совпадении формируется импульс включения симистора с длительностью, равной одному периоду тактовой частоты на входе таймера (примерно 50-60 мкс).
Настроено прерывание от таймера по совпадению с OCR0B. Оно случается примерно в середине каждого полупериода, когда состояние аналогового компаратора стабильно. В этот момент очищается флаг и вновь разрешается прерывание от аналогового компаратора.
Настроено прерывание по переполнению таймера. При нормальной работе диммера, оно никогда не присходит, т.к. таймер перезапускается раньше, чем успевает досчитать до "конца". Если оно всё-таки произошло, то значит, что-то случилось с сетевым напряжением. Скорее всего, его просто выключили. По этому прерыванию настройки запоминаются в EEPROM, а микроконтроллер переключается в спящий режим. Чтобы микроконтроллер успел всё это сделать, по питанию включён конденсатор достаточно большой ёмкости.
Re: детектор нуля, управление фазой
takei писал(а):Вот первый результат по программе
Выход PD0 , прицепил светодиод, яркость меняется, значится схема получается живая...
Далее МОС3052+ВТ136, лампа горит во весь накал, при уменьшении периода синусоиды кнопкой минус
Для отпирания симистора достаточно короткого импульса.
Будете проходить мимо- проходите!
Re: МК должен управлять болгаркой (MK>db3>bt136= 0 -1250 об/
clawham писал(а): я закупился BTA24-600CWRG - 25 ампер 600 вольт, Изолированная подложка!!!!!
а буква W означает - не нужен снабер.
Будете проходить мимо- проходите!
- vitalik_1984
- Поставщик валерьянки для Кота
- Сообщения: 2482
- Зарегистрирован: Пт авг 27, 2010 05:57:06
- Откуда: Тюмень
- Контактная информация:
Re: МК должен управлять болгаркой (MK>db3>bt136= 0 -1250 об/
Да действительно,слышал такое: чтобы использовать регистры во вставках есть функция блокировки регистров, но они получается выпадают из работы компилятора и оптимизатора.clawham писал(а):не путайте пожалуйста милли и МИКРО секунды!!!
.............
надбавьте ещё 32-12 НОПа и хватит....использовать вставки очень опасно!!! компилятор не сохраняет использованный Вами регистр ибо он не используется в прерывании(Сишной его части) - потому если где-то в программе он будет использоваться и тут произойдёт прерывание - вы его запортите! да и не нужно этого....Вам не 2000 тактов надо пропустить...всего 20....
Определенно есть и этоtakei писал(а):Только, наверное 70 это сильно, может есть метод задать эти 21 mS программно в цифровом значении?
Спасибо.
Код: Выделить всё
delay_us(21); В этом случае создастся точно такой же по смыслу фрагмент кода и в отличие от вставки он никак не повлияет на работу компилятора/оптимизатора.
-
takei
- Нашел транзистор. Понюхал.
- Сообщения: 181
- Зарегистрирован: Пн янв 14, 2013 15:06:57
- Откуда: Д.Вс.
Re: МК должен управлять болгаркой (MK>db3>bt136= 0 -1250 об/
Собрал в железе , как одиночное устройство (без всяких наворотов) работает отлично.
Но теперь нужно браться за всякие там "навороты" и тут вопросы?
Первое. При пропадании синхроимпульса из сети (например неисправность какой-то части схемы), то есть будет отсутствовать на INT0 прерывание...
Как организовать отключение работы таймера TIM1_COMPA, соответственно и управление тиристором тоже будет 0.
Примерно так
Второе. Как эту схему перевести из регулировки в 1025 ступеней в шим 255 ступеней.
Но теперь нужно браться за всякие там "навороты" и тут вопросы?
Первое. При пропадании синхроимпульса из сети (например неисправность какой-то части схемы), то есть будет отсутствовать на INT0 прерывание...
Как организовать отключение работы таймера TIM1_COMPA, соответственно и управление тиристором тоже будет 0.
Примерно так
Код: Выделить всё
interrupt [TIM1_COMPA] void timer1_compa_isr(void)
{
if ( каким тут воспользоватся условием????? ) {
TTT_PIN = 1;
GIFR|=(1<<6); // сбросили флаг прерывания - Флаг сбрасывается ЕДИНИЦЕЙ
GICR|=(1<<6);
OCR1A = procent;
#asm("nop"); // все элементарно просто спасибо clawham
delay_us(19); // опять все просто, спасибо vitalik_1984
TTT_PIN = 0;
}
else {
OCR1A = 0; //???????????????
TTT_PIN = 0; //??????????????
};
}Второе. Как эту схему перевести из регулировки в 1025 ступеней в шим 255 ступеней.
-
clawham
- Поставщик валерьянки для Кота
- Сообщения: 1957
- Зарегистрирован: Пт окт 31, 2008 09:38:55
- Откуда: Одесса
- Контактная информация:
Re: МК должен управлять болгаркой (MK>db3>bt136= 0 -1250 об/
по поводу пропадания сонхры - просто ловите полное переполнение таймера...вы же его каждый синхроимпульс сбрасываете в ноль...если так и не сбросили(а лучше сделать "повторялку) в 5-10 раз - сбрасываемся в ноль
далее как перевести?
1024/256= сколько?
ЧЕТЫРЕ!
что такое Четыре?
это 1024/4
а что такое /4?
Это сдвиг влево на 2 разряда!
вот и пишите 1024<<2
далее как перевести?
1024/256= сколько?
ЧЕТЫРЕ!
что такое Четыре?
это 1024/4
а что такое /4?
Это сдвиг влево на 2 разряда!
вот и пишите 1024<<2
Что нас не убило сделало нас осторожней
Не доверяйте русским лужам - это может быть вход в метро.
Не доверяйте русским лужам - это может быть вход в метро.
-
clawham
- Поставщик валерьянки для Кота
- Сообщения: 1957
- Зарегистрирован: Пт окт 31, 2008 09:38:55
- Откуда: Одесса
- Контактная информация:
Re: МК должен управлять болгаркой (MK>db3>bt136= 0 -1250 об/
а нам надо деление ... то вправо...я ж не знаю что у него во чно преобразовывается?
0...256 вход -> 0...1024 выхода или наоборот
Что нас не убило сделало нас осторожней
Не доверяйте русским лужам - это может быть вход в метро.
Не доверяйте русским лужам - это может быть вход в метро.
- ibiza11
- Поставщик валерьянки для Кота
- Сообщения: 1900
- Зарегистрирован: Сб фев 21, 2009 13:11:40
- Откуда: Москва
Re: МК должен управлять болгаркой (MK>db3>bt136= 0 -1250 об/
как я это прочел:clawham писал(а):а что такое /4?
Это сдвиг влево на 2 разряда!
вот и пишите 1024<<2
"а что такое поделить на 4?
Это сдвиг влево на 2 разряда!
вот и пишите 1024 сдвинуть влево 2 раза"
так это не поделить, а умножить на 4 получится! (1024<<2 = 4096)
Излагайтесь яснее пожалуйста.
Если не знаете, зачем тогда вообще направление сдвига говорить?clawham писал(а):а нам надо деление ... то вправо... ж не знаю что у него во чно преобразовывается
Ставим плюсы: )