Обсуждаем контроллеры компании Atmel.
Ответить

Re: плавный пуск + регулятор скорости коллекторного двигател

Пн окт 05, 2020 13:29:56

Serzh2000, вот код ARV, сократил, оставил плавный пуск, добавил АЦП
Спойлер
Код:
//#define F_CPU (9600000uL)

#include "stdint.h"
#include "avr/io.h"
#include "avr/interrupt.h"
#include "util/delay.h"
#include "stdbool.h"

// вспомогательные общие макросы
#define _CONCAT_(x,y)      x ## y
/// вспомогательный макрос слияния символов
#define CONCAT(y,x)      _CONCAT_(y,x)

// таймеры
// предделители тактовой
#define TIMER_CLK_DIV_1               1
#define TIMER_CLK_DIV_8               2
#define TIMER_CLK_DIV_64            3
#define TIMER_CLK_DIV_256            4
#define TIMER_CLK_DIV_1024            5
#define TIMER_CLK_EXT_FALL            6
#define TIMER_CLK_EXT_RISE            7
#define TIMER_CLK_DIV(x)            CONCAT(TIMER_CLK_DIV_,x)

/// предделитель таймера
#define TMR_DIV      8

#define MAX_P      200
#define PHASE_STEP   5
#define MIN_P      PHASE_STEP
#define PHASE_OFF   (MAX_P + PHASE_STEP)

/// рабочий порт дл¤ выхода на симистор
#define OUTPORT      PORTB
/// выходной пин порта дл¤ управлени¤ симистором
#define   OUT_PIN         _BV(PB0)

/// ”становка сброса дл¤ режима —“—
#define CTC         (F_CPU/TMR_DIV/MAX_P/100)

#define noinit __attribute__((section(".noinit")))

/// счетчик для регулирования фазы
volatile uint8_t    COUNTER;
/// текущая фаза отпирания симистора
volatile noinit uint8_t   out_phase;
/// заданная фаза отпирания симистора
volatile noinit uint8_t   sel_phase;
/// флажок включения нагрузки
volatile noinit uint8_t   on;

/// длительность выходного импульса управлени¤ симистором 4*50=200us
#define PULSE_LEN   4
/// действие по совпадению канала ј
#define do_comp_A()   OUTPORT |= OUT_PIN
/// действие по совпадению канала ¬
#define do_comp_B()   OUTPORT &= ~OUT_PIN

#define STARTUP_DELAY           20
#define PULSE_TRIAC               200

#define pwm1_on() { PORTB |= (1<<PB0);  }
#define pwm1_off(){ PORTB &= ~(1<<PB0); }

// Bandgap Voltage Reference: Off
#define ADC_VREF_TYPE ((0<<REFS0) | (1<<ADLAR))

// Read the 8 most significant bits
// of the AD conversion result
uint8_t read_adc(void)
{
// Start the AD conversion
ADCSRA|=(1<<ADSC);
// Wait for the AD conversion to complete
while ((ADCSRA & (1<<ADIF))==0);
ADCSRA|=(1<<ADIF);
return ADCH;
}

/** Прерывание таймера по совпадению канала А.
 * Таймер настроен так, что прерывание возникает 200 раз в полупериод сети. 50us
 * Обработчик реализует виртуальные регистры совпадения для фазового регулирования.
 */
ISR(TIM0_COMPA_vect)
{
   COUNTER++;
   // виртуальный регистр совпадения для включения импульса
   if(COUNTER == out_phase){
      do_comp_A();
   }
   // виртуальный регистр совпадения для выключения импульса
   if(COUNTER == (out_phase + PULSE_LEN)){
      do_comp_B();
   }

}

/** Прерывание по изменению состояния синхро-пина.
 * Возникает по фронту и спаду синхроимпульса, т.е. 100 раз в секунду
 * Реализует синхронизацию с сетью.
 */
ISR(PCINT0_vect)
{
   COUNTER = 0;                        // обнуляем счетчик таймера
   OUTPORT &= ~OUT_PIN;                  // выключаем на всякий случай выход
   if(on){
      // если включено - плавно приближаем текущую фазу к заданной
      if(sel_phase > out_phase){
         out_phase++;
      } else if(sel_phase < out_phase){
         out_phase--;
      } else if(sel_phase == out_phase) on = 0;
      
   } else out_phase = sel_phase;

}

int main(void){
// Declare your local variables here

// Crystal Oscillator division factor: 1
CLKPR=(1<<CLKPCE);
CLKPR=(0<<CLKPCE) | (0<<CLKPS3) | (0<<CLKPS2) | (0<<CLKPS1) | (0<<CLKPS0);

// Input/Output Ports initialization
// Port B initialization
// Function: Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=Out
DDRB=(0<<DDB5) | (0<<DDB4) | (0<<DDB3) | (0<<DDB2) | (0<<DDB1) | (1<<DDB0);
// State: Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=0
PORTB=(0<<PORTB5) | (0<<PORTB4) | (0<<PORTB3) | (0<<PORTB2) | (0<<PORTB1) | (0<<PORTB0);

TCCR0A=(0<<COM0A1) | (0<<COM0A0) | (0<<COM0B1) | (0<<COM0B0) | (1<<WGM01) | (0<<WGM00);
TCCR0B = TIMER_CLK_DIV(TMR_DIV);         // делитель таймера
TCNT0=0x00;
OCR0A   = CTC;                        // порог сброса
OCR0B=0x00;

// Timer/Counter 0 Interrupt(s) initialization
TIMSK0=(0<<OCIE0B) | (1<<OCIE0A) | (0<<TOIE0);

// External Interrupt(s) initialization
// INT0: Off
// Interrupt on any change on pins PCINT0-5: On
GIMSK=(0<<INT0) | (1<<PCIE);
MCUCR=(0<<ISC01) | (0<<ISC00);
PCMSK=(0<<PCINT5) | (0<<PCINT4) | (0<<PCINT3) | (1<<PCINT2) | (0<<PCINT1) | (0<<PCINT0);
GIFR=(0<<INTF0) | (1<<PCIF);

ACSR=(1<<ACD) | (0<<ACBG) | (0<<ACO) | (0<<ACI) | (0<<ACIE) | (0<<ACIS1) | (0<<ACIS0);
DIDR0=(0<<AIN0D) | (0<<AIN1D);

// ADC initialization
// ADC Clock frequency: 75,000 kHz
// ADC Bandgap Voltage Reference: Off
// ADC Auto Trigger Source: Free Running
// Only the 8 most significant bits of
// the AD conversion result are used
// Digital input buffers on ADC0: On, ADC1: On, ADC2: On, ADC3: On
DIDR0|=(0<<ADC0D) | (0<<ADC2D) | (0<<ADC3D) | (0<<ADC1D);
ADMUX=ADC_VREF_TYPE;
ADCSRA=(1<<ADEN) | (0<<ADSC) | (1<<ADATE) | (0<<ADIF) | (0<<ADIE) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0);
ADCSRB=(0<<ADTS2) | (0<<ADTS1) | (0<<ADTS0);

ADMUX = 3 | ADC_VREF_TYPE;

out_phase = MAX_P;

// Global enable interrupts
sei();

on = 1;

while (1)
      {
      // Place your code here
    
      sel_phase = ((read_adc()*MAX_P) / 255);

      }
    
}
В коде ARV вот этот участок
Спойлер
Код:
if(on){
      // если включено - плавно приближаем текущую фазу к заданной
      if(sel_phase > out_phase){
         out_phase++;
      } else if(sel_phase < out_phase){
         out_phase--;
      } else if(sel_phase == out_phase) on = 0;
      
   } else out_phase = sel_phase;
можно заменить на
Спойлер
Код:
      // если включено - плавно приближаем текущую фазу к заданной
      if(sel_phase > out_phase){
         out_phase++;
      } else if(sel_phase < out_phase){
         out_phase--;
      }
будет плавно регулироваться.

Вот еще вам один вариант с плавным пуском
Спойлер
Код:
//#define F_CPU (9600000uL / 8)

#include "stdint.h"
#include "avr/io.h"
#include "avr/interrupt.h"
#include "util/delay.h"
#include "stdbool.h"

bool pusk, err;
volatile uint8_t pwm_set;
volatile uint8_t pwm_temp;

#define STARTUP_DELAY           20
#define PULSE_TRIAC               200

#define pwm1_on() { PORTB |= (1<<PB0);  }
#define pwm1_off(){ PORTB &= ~(1<<PB0); }

// Bandgap Voltage Reference: Off
#define ADC_VREF_TYPE ((0<<REFS0) | (1<<ADLAR))

// Read the 8 most significant bits
// of the AD conversion result
uint8_t read_adc(void)
{
// Start the AD conversion
ADCSRA|=(1<<ADSC);
// Wait for the AD conversion to complete
while ((ADCSRA & (1<<ADIF))==0);
ADCSRA|=(1<<ADIF);
return ADCH;
}

ISR(TIM0_COMPA_vect)
{

if(!err) pwm1_on();
_delay_us(PULSE_TRIAC);
pwm1_off();
err = 1;
}

ISR(PCINT0_vect)
{
err = 0;
TCNT0 = pwm_set;
}

int main(void){
// Declare your local variables here

// Crystal Oscillator division factor: 1
CLKPR=(1<<CLKPCE);
CLKPR=(0<<CLKPCE) | (0<<CLKPS3) | (0<<CLKPS2) | (0<<CLKPS1) | (0<<CLKPS0);

// Input/Output Ports initialization
// Port B initialization
// Function: Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=Out
DDRB=(0<<DDB5) | (0<<DDB4) | (0<<DDB3) | (0<<DDB2) | (0<<DDB1) | (1<<DDB0);
// State: Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=0
PORTB=(0<<PORTB5) | (0<<PORTB4) | (0<<PORTB3) | (0<<PORTB2) | (0<<PORTB1) | (0<<PORTB0);

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 18,750 kHz
// Mode: CTC top=OCR0A
// OC0A output: Disconnected
// OC0B output: Disconnected
// Timer Period: 9,9733 ms
TCCR0A=(0<<COM0A1) | (0<<COM0A0) | (0<<COM0B1) | (0<<COM0B0) | (1<<WGM01) | (0<<WGM00);
TCCR0B=(0<<WGM02) | (0<<CS02) | (1<<CS01) | (1<<CS00);
TCNT0=0x00;
OCR0A=0xBA; // 0xBA - 9.6MGz / 8
OCR0B=0x00;

// Timer/Counter 0 Interrupt(s) initialization
TIMSK0=(0<<OCIE0B) | (1<<OCIE0A) | (0<<TOIE0);

// External Interrupt(s) initialization
// INT0: Off
// Interrupt on any change on pins PCINT0-5: On
GIMSK=(0<<INT0) | (1<<PCIE);
MCUCR=(0<<ISC01) | (0<<ISC00);
PCMSK=(0<<PCINT5) | (0<<PCINT4) | (0<<PCINT3) | (1<<PCINT2) | (0<<PCINT1) | (0<<PCINT0);
GIFR=(0<<INTF0) | (1<<PCIF);

// Analog Comparator initialization
// Analog Comparator: Off
// The Analog Comparator's positive input is
// connected to the AIN0 pin
// The Analog Comparator's negative input is
// connected to the AIN1 pin
ACSR=(1<<ACD) | (0<<ACBG) | (0<<ACO) | (0<<ACI) | (0<<ACIE) | (0<<ACIS1) | (0<<ACIS0);
// Digital input buffer on AIN0: On
// Digital input buffer on AIN1: On
DIDR0=(0<<AIN0D) | (0<<AIN1D);

// ADC initialization
// ADC Clock frequency: 75,000 kHz
// ADC Bandgap Voltage Reference: Off
// ADC Auto Trigger Source: Free Running
// Only the 8 most significant bits of
// the AD conversion result are used
// Digital input buffers on ADC0: On, ADC1: On, ADC2: On, ADC3: On
DIDR0|=(0<<ADC0D) | (0<<ADC2D) | (0<<ADC3D) | (0<<ADC1D);
ADMUX=ADC_VREF_TYPE;
ADCSRA=(1<<ADEN) | (0<<ADSC) | (1<<ADATE) | (0<<ADIF) | (0<<ADIE) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0);
ADCSRB=(0<<ADTS2) | (0<<ADTS1) | (0<<ADTS0);

ADMUX = 3 | ADC_VREF_TYPE;

pwm_temp = ((read_adc()*0xBA) / 255);

pusk = 0; pwm_set=0; err=0;

// Global enable interrupts
sei();

while (1)
      {
      // Place your code here
    
     if(!pusk) {
      for(uint8_t i=0; i<pwm_temp; i++)
      {
        pwm_set++;
       _delay_ms(STARTUP_DELAY);
      }
      pusk = 1;
     } else {
     pwm_set = ((read_adc()*0xBA) / 255);
     }

      }
    
}

Re: плавный пуск + регулятор скорости коллекторного двигател

Пн окт 05, 2020 13:44:47

БОЛЬШОЕ СПАСИБО!!! ВЫ ХОРОШИЙ ЧЕЛОВЕК!

Re: плавный пуск + регулятор скорости коллекторного двигател

Ср окт 07, 2020 14:28:24

коды не работают как надо :cry:

вот код ARV

код ARV код №1: у меня осциллографа нет, а на глаз лампочка загорается сразу (плавного старта, примерно в 2-3 сек, нет)

переменником плавно увеличивает яркость, но в конце переменника лампочка тухнет.

еще вам один вариант

код №2: плавного старта тоже нет, переменник на минимуме - лампочка светит 1/4 яркости, начинаю прибавлять где то посередине плавно начинает увеличивается яркость пройдя середину яркость максимальная, но хода переменника еще много.

в принципе в протеусе это тоже видно.. :facepalm: :solder:

Re: плавный пуск + регулятор скорости коллекторного двигател

Ср окт 07, 2020 14:54:42

Serzh2000 писал(а):в принципе в протеусе это тоже видно..
В протеусе все работает как надо.
Вы обратили внимание:
код ARV код №1 работает на частоте
Код:
F_CPU (9600000uL)
код №2 работает на другой частоте
Код:
F_CPU (9600000uL / 8)

И свою схему нарисуйте.

Re: плавный пуск + регулятор скорости коллекторного двигател

Ср окт 07, 2020 15:39:48

код №1 (AVR):
фьюзы
0x7A LOW
0xFF HIGH


код №2:
фьюзы
0x6A LOW
0xFF HIGH

правильно?

Изображение

код AVR

Re: плавный пуск + регулятор скорости коллекторного двигател

Ср окт 07, 2020 16:00:09

Фьюзы правильны.
Схема управления симистором не правильная.
Спойлер

Re: плавный пуск + регулятор скорости коллекторного двигател

Ср окт 07, 2020 17:27:23

:))) :beer:
в протеусе работает :))

плату придется перепаивать - это мелочи. СПАСИБО!
чтоб наверняка схему выложите, пожалуйста. :wink:

Re: плавный пуск + регулятор скорости коллекторного двигател

Чт окт 08, 2020 11:15:26

Dimon456 а зачем диодный мост и U4 если 0 отслеживать тогда зачем R1.R2.D1? :shock:

Добавлено after 1 hour 6 minutes 12 seconds:
Re: плавный пуск + регулятор скорости коллекторного двигателя
а вот у Вас в протеусе при плавном пуске от больших оборотов к маленьким движется зеленый луч... (обороты уменьшаются)
или я ошибаюсь?

Re: плавный пуск + регулятор скорости коллекторного двигател

Чт окт 08, 2020 15:14:56

Serzh2000, диодный мост и U4 - это мне для экспериментов в протеусе.
Я не знаю как правильно, смотрите примеры в инете. У меня не было в наличии МОС, я обошелся диодным мостом и советским оптроном АОУ101 или 103 (не помню точно).
А схема примерно так
СпойлерИзображение

Re: плавный пуск + регулятор скорости коллекторного двигател

Пт окт 09, 2020 06:58:20

...
А что за симистр используете?
Попробуйте с sensitive gate, к примеру: BT134(136,138,139)-600(800)E, с буковкой Е.

Re: плавный пуск + регулятор скорости коллекторного двигател

Пн дек 13, 2021 13:42:40

оживим тему. по даташиту 13 нога имеет три режима. но у всех используется только средний режим (нога в воздухе)
за что отвечает каждый из трёх режимов объясните плиз ?

я про U2010B

Re: плавный пуск + регулятор скорости коллекторного двигател

Пн дек 13, 2021 18:10:59

я про U2010B

вы точно тему не перепутали? здесь про плавный пуск + регулятор скорости коллекторного двигателя на микроконтроллере (ATTiny13)

Re: плавный пуск + регулятор скорости коллекторного двигател

Вт дек 14, 2021 02:32:45

точно. тут с самого начала говорилось зачем изобретать велосипед если есть 2010

Добавлено after 5 minutes 23 seconds:
Re: плавный пуск + регулятор скорости коллекторного двигателя
нашел такую статейку http://chipgu.ru/viewtopic.php?t=3502 на микросхеме U2010B
вопрос-1: кто то собирал этот регулятор и как впечатления?

Изображение
вот про этот переключатель на 13 ноге спрашиваю. (про 9 знаю)

Re: плавный пуск + регулятор скорости коллекторного двигател

Вт дек 14, 2021 13:19:44

говорят, что супер :))
https://sxem.org/forum/skhemo-temy/693- ... toku#48669

Re: плавный пуск + регулятор скорости коллекторного двигател

Ср дек 15, 2021 11:41:48

Serzh2000, так то ваш вопрос был :) не мой. я лишь показал что тема правильная.

мой вопрос - по даташиту 13 нога имеет три режима. но у всех используется только средний режим (нога в воздухе)
за что отвечает каждый из трёх режимов объясните плиз ?

Re: плавный пуск + регулятор скорости коллекторного двигател

Ср дек 15, 2021 19:08:33

вы про эту ногу? :dont_know:

Описание контактов

Вывод Обозначение Функция
1 Isense Измерение тока нагрузки
2 Isense Измерение тока нагрузки
3 Cφ Напряжение разгона
4 Control Вход управления
5 Comp. Выход компенсации
6 ILoad Ограничение тока нагрузки
7 Сsoft Плавный пуск
8 VRef Опорное напряжение
9 Mode Выбор режима
10 GND Земля
11 VS Напряжение питания
12 High load Индикация высокой нагрузки
13 Overload Индикация перегрузки
14 VRφ Регулировка скорости нарастания тока
15 VSync. Синхронизация напряжения
16 Output Выход триггера (запускающих импульсов)


вроде как ясно из даташита :facepalm:
режиме работы контакт 13 переключается на -VS (контакт 11) и контакт 6 на GND (контакт 10) после того, как V6 достигает порога VT100. Конденсатор плавного пуска закорачивается, а угол управления переключается на αmax. Это положение сохраняется до тех пор, пока напряжение питания не отключится. При повторном включении питания двигатель можно снова запустить с функцией плавного пуска. Поскольку состояние перегрузки переключает контакт 13 на контакт 11, можно использовать меньший угол управления, αmax, путем подключения дополнительного сопротивления между контактами 13 и 14.


Если необходимо - можно организовать индикацию посредством пина 13(Overload). В режиме А, при перегрузке, там появляется напряжение питания(пин 11). Правда выходной ток 13ой ноги мал(по моему что-то около 1mA).
Поставить банальный ключик на биполярнике со светодиодом и ограничивающим резистором в коллекторе.

вот тут подробнее https://rudatasheet.ru/datasheets/u2010b/ :P

Re: плавный пуск + регулятор скорости коллекторного двигател

Чт дек 16, 2021 20:41:28

спасибо

Re: плавный пуск + регулятор скорости коллекторного двигател

Ср янв 03, 2024 14:37:21

Здравствуйте,

Подскажите пожалуйста схема на картинке годная или ниочем? Мне надо плавный пуск и регулировка оботоров для торцовочной пилы 1800Вт. Готовое решение не могу нигде найти чтобы было и регулировка оборотов и плавный пуск. Пользуюсь одним популярным сайтом, с разными прикольными самоделками на ардуино, нашел диммер. С программированием я хорошо, вот с аппаратной частью и электроникой так себе, не понимаю годная ли схема.

СпойлерИзображение

тут нет ни доп конденсаторов и резисторов (я так понимаю нужны для нагрузки индуктивной)


Если кто знает готовое решение, которое можно легко купить на условном алиэкспресс - еще лучше будет!

Re: плавный пуск + регулятор скорости коллекторного двигател

Ср янв 03, 2024 14:50:40

https://radiokot.ru/artfiles/6555/
посмотри, может подойдет!

Re: плавный пуск + регулятор скорости коллекторного двигател

Ср янв 03, 2024 15:28:42

Плавный пуск это хорошо и нужно для инструмента у которого своего нет.
но все схемы как правило на три провода.
То есть подавать напряжение надо на схему,
а уже она обеспечит плавный пуск, можно и с регулировкой оборотов.
У меня в гараже для работы, блок управления на нем розетка для инструмента
и переноска на барабане с двумя розетками, одна напрямую другая с регулятором,
но проблема в том, что регулятор работает, а вот плавный пуск нет, чтобы работал плавный пуск,
надо заранее включить инструмент, и подать напряжение на переноску тогда будет плавный пуск.
хотелось бы найти такую не шибко замороченную схему регулятора с плавным пуском,
но чтобы смонтировать в переноске, а запускалась бы от включения штатным выключателем инструмента.
Есть вот такая схема
Изображение
Работать похоже будет, а вот повторного пуска при заряженном конденсаторе,
а он до-олго будет сам разряжаться, и повторного плавного пуска уже не будет.
Может есть другое решение?
Мне кажется надо при обесточивании схемы, как то быстро разрядить конденсатор.
Ответить