Зарядное устройство на основе понижающего преобразователя

minamonra
Offline
Зарегистрирован: 18.06.2014

Это продолжение темы про ups, которую в принципе можно снести, функции бесперебойника прикрутить к зарядке не сильно то и сложно, больше внимания решил уделить заряду.

Немного почесав затылок, переделал предыдущую схему, и получил удовлетворительный результат. К управлению п-канального мосфета прикрутил драйвер на биполярах, и нагрев при работе стал минимален. Схема:

s_1406106191_9932855_8a1287fa02.gif

Существует сейчас вот в таком виде:

s_1406105960_8837031_ed6c8f32fc.jpg

Драйвер собран навесом. При питании 27 вольт и нагрузке 1А за час работы какого-бы нагрева не замечено (частота 20kHz). :_) По появлению свободного времени пере-разведу плату. Транзистор VT2 в принципе не сильно нужен, задел для защиты, думаю добавив TL431 к VT2 и использовав имеющийся ОУ это можно реализовать. Также была мысль о драйвере на IR21xx и н-канальном полевике, но пока руки не дошли, плюс драйвера на IR - возможность использовать встроенную токовую защиту. Код сейчас простой:

#include <TimerOne.h>
#include <PWM.h>
#include "arduino.h"
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,20,4);
int VBAT = 0;
int IBAT = 0;
int CURRENT = 180;
int DUTY = 0;
int32_t frequency = 15000; // desired frequency in Hertz
#define PWM_PIN 3          // the output pin for the pwm 
byte chargeState = 0;      // вкл/выкл заряда

void setup () {
 pinMode(0, INPUT);
 pinMode(1, INPUT);
 lcd.init();
 lcd.backlight();
 InitTimersSafe(); 
  bool success = SetPinFrequencySafe(PWM_PIN, frequency);
  //if the pin frequency was set successfully, turn pin 13 on
  if(success) {
    pinMode(13, OUTPUT);
    digitalWrite(13, HIGH);
  } 
}

void loop () {
 VBAT = analogRead(0);
 IBAT = analogRead(1);
 // DUTY == DUTY*10;
 if (IBAT>CURRENT) DUTY--;
 if (IBAT<CURRENT) DUTY++;
 // DUTY == DUTY/10;
 if (DUTY>250) DUTY = 250;
 if (DUTY<1)   DUTY = 1;
 if (VBAT>909) chargeState = 1;
 if (VBAT<843) chargeState = 0;
 if (CURRENT>400 ) DUTY=1;
 if (chargeState == 0) pwmWrite(PWM_PIN, DUTY);
 else pwmWrite(PWM_PIN, 0);

  lcd.setCursor(0, 0);
  lcd.print("V:");
  if (VBAT<1000) lcd.print(0); if (VBAT<100) lcd.print(0); if (VBAT<10) lcd.print(0);
  lcd.print(VBAT);lcd.print(" ");
  lcd.print("I:");
  if (IBAT<1000) lcd.print(0); if (IBAT<100) lcd.print(0); if (IBAT<10) lcd.print(0);
  lcd.print(IBAT);lcd.print(" ");
  lcd.setCursor(0, 1);
  lcd.print("D:");
  if (DUTY<1000) lcd.print(" "); if (DUTY<100) lcd.print(0); if (DUTY<10) lcd.print(0);
  lcd.print(DUTY);
  lcd.print(" F:"); lcd.print(frequency/1000);lcd.print("kHz");
}

 

Алгоритм заряда пока не реализован, только отключение при достижении напряжения заряда и включение при разряде до 13.2 Библиотеку для ШИМ использовал отсюда.

minamonra
Offline
Зарегистрирован: 18.06.2014

Затылок зачесался по причине прочтения стр 18 этого документа, также думаю не лишним будет перенести R3 в эмиттер VT1.

leshak
Offline
Зарегистрирован: 29.09.2011

minamonra пишет:

Затылок зачесался по причине прочтения стр 18 этого документа, также думаю не лишним будет перенести R3 в эмиттер VT1.

Надеюсь не будете возражать если я утяну вашу ссылочку в родственную тему Проблема подбора MOSFET транзистора | Аппаратная платформа Arduino

P.S. Эх... когда нибудь будет время прочитать это внимательно и вдумчиво :)

 

minamonra
Offline
Зарегистрирован: 18.06.2014

Не, никаких возражений, кстати я тоже не от корки до корки там всё прочитал, только интересующее, как говаривал известный персонаж, "нельзя объять необъятное". По поводу защиты - задумка следующая - при достижении ~5.2 вольт на выходе ОУ измерителя тока гасить свет.:_) (ведь всё-равно ток который больше чем значение 1024 - это уже предел, соответственно максимальный ток настраивать делителем R10/R11). Думаю защита необходима - как компенсация медлительности мк.

//

Попробовал изобразить защиту.

s_1406151774_6867634_c7fcc26dbc.gif

Может мысли у кого будут?

minamonra
Offline
Зарегистрирован: 18.06.2014

Опробовал защиту на макете, работает, может потребоваться конденсатор на ref TL431. Номиналы подбирать все-равно. Работу можно глянуть в симуляторе, облегчает подбор делителей, файл мултисима можно взять тут.

Настроен на макс ток 1A, хотя схема позволяет больше, зависит от силовых элементов, индуктивности... Там же тестовая печать.

В общем-то это не только зарядка получилась, можно использовать как регулируемый стабилизированный источник питания с функцией стабилизации тока, как угодно. Макс питание без изменений в схеме 30 вольт, для повышения, либо ограничить питание ОУ, либо взять другой.

 

minamonra
Offline
Зарегистрирован: 18.06.2014

Что-то не сильно интересно, хотелось бы комментариев, ведь силовой модуль получился неплохой.

Последний вариант:

s_1406291850_2291999_e741d59ee0.gif

Пока вроде добавить нечего.

NE_XT
NE_XT аватар
Offline
Зарегистрирован: 22.05.2012

Очень интересно, жду высоковольтные Р-мосфеты, попробывать с 260 вольтами поработать :) , столько у меня солнечные панели выдают.

Напомните плиз, какие диоды шотки vd2?

minamonra
Offline
Зарегистрирован: 18.06.2014

Ох, на такое напряжение не планировал, хотя... высокая часть отделена, ничего не мешает взять другие транзисторы и попробовать.

VD2 у меня MBRF30100 в пластике, шоттки на большое напряжение не так много, можно ультрафасты какие-нибудь подыскать.

Сейчас "начисто" собрал, нюанс всплыл - цепь питания защиты и ОУ отделить от силовой части диодом надо, после этого короткое на выходе ловит изумительно.

ы. Для таких напряжений думаю все-таки трансформатор уже нужен, либо дроссель с двумя обмотками.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

у меня один вопрос: пульстации из-за шима не влияют на измерения тока и напряжения? вижу фильтры, но справляются ли они

и вот с этим куском не очень понятно. могли бы пояснить

minamonra
Offline
Зарегистрирован: 18.06.2014

При появлении на выходе измерителя тока (U1A) напряжения больше 5 (ведь больше нам и не надо) вольт откроется TL431, транзистор VT2 через оптрон прижмет базу VT1 к земле и преобразователь выключится, те это триггерная защита, включить обратно можно либо выключением питания, либо кнопкой "сброс".

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

а смысл ставить транзистор если 431 может через себя пропустить такой же ток как и транзистор?

без vd4 в принципе тоже можно обойтись. входное сопротивление делителя высокое, влияние почти не будет оказывать

вместо TLP431 может применить более распрастраненный PC817, а то я даже даташит на него не нашел

так как все подается на ардуину или отдельный микроконтроллер может схему защиты запитать от 5В питания микроконтроллера, так как когда сработает защита, но не закроется полевик или заглючит схема усилителя датчика тока, выделяемая мощность на транзисторе VT2 может его сжечь. просто подстаховаться

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

inspiritus
Offline
Зарегистрирован: 17.12.2012

Хм... если не секрет ... для чего создавалось это устройство, если зарядный универсал-монстр для заряки / тренировки / балансировки чего-угодно на иБээ стоит 700-1200 р ???

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

ну что за люди. все только готовое, китайцы у кого то скопировали они и рады купить

если интереса нет вам конечно незачем, а кому то интересно

тогда зачем тут вообще сидеть? тут люди как раз что то делают, а не готовое покупают. а интересы у всех разные

minamonra
Offline
Зарегистрирован: 18.06.2014

jeka_tm пишет:

а смысл ставить транзистор если 431 может через себя пропустить такой же ток как и транзистор?

Триггера не будет, транзистор шунтирует собой 431-ую. Те транзистор как "защелка", именно такой вариант хотел. VD4 перестраховка, лучше пере.... можно и не ставить. TLP431 - мой недочет, автоматом скопировал, TLP721 конечно же, хотя без разницы любой на подходящий по схеме ток подойдет.

jeka_tm пишет:

так как все подается на ардуину или отдельный микроконтроллер может схему защиты запитать от 5В питания микроконтроллера, так как когда сработает защита, но не закроется полевик или заглючит схема усилителя датчика тока, выделяемая мощность на транзисторе VT2 может его сжечь. просто подстаховаться

Так внимательно на схему посмотрите, если сработает защита полевик закроется, и без разнице что-там на микроконтроллере. Ну или в мултисиме выше выложил ссылку можно посмотреть.

Вообще защиту внедрил именно для того чтобы избежать непредвиденных ситуаций с мк, можно и без нее...

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

а вот почему. чтобы сигнал на выходе не появился автоматом даже если проблема уже решена. т.е. пока не нажмешь кнопку он так и будет ждать?

если так то транзистор VT2 может просто сгореть. в худшем случае на нем будет падать 0,58вт, хотя максимум 0,5вт (хотя мое личное мнение что производитель завышает характеристики. чтобы SOT23 спокойно рассеивал 0,5Вт. ну х.з.)

блин ошибочка вышла. перепутал с BC857)))

minamonra
Offline
Зарегистрирован: 18.06.2014

На днях немного покоптил преобразователь, дроссель на "гантеле" DRWW14*15 (7 мм) 20 витков в четыре жилы 0.6. До 3A - холодный, 6А - уже печка, надо думать о материале сердечника. Распыленное железо не сильно хочу из-за размеров, тут либо Ш-образный феррит с зазором подыскать, либо подсмотреть у китайцев аналоги Kool mu колец, вот например:

 

s_1406716142_2599335_1d9c93b339.jpg брал на али, 150W заявлено, ключ - STP80NF70 (68V, 0.0082Ω, 98A) сильный... Контроллер - UC2843, но самое интересное это кольцо, думаю где бы найти.

ы. Я наверное из "старой" гвардии... на smd до сих пор перейти не могу, люблю выводные детали и все тут, хотя и пару тройку чип наборов лежит.

ыы. Вообще пока "вслепую" осциллограф соседу одолжил, к выходным если заберу, хоть увижу что-нибудь.

 

jeka_tm пишет:
если так то транзистор VT2 может просто сгореть
Да не должен, в любом случае R4 - на вскидку номинал.

 

А ну и еще печать, которую выложил - она на скорую руку, дороги силовые у меня на токе 6А разогрелись сильно, либо медь поверх напаять, либо шире сделать.

minamonra
Offline
Зарегистрирован: 18.06.2014

jeka_tm пишет:
и кстати зря картинки не на сервер сайта закачиваете. на хостингах скоро пропадет и увидеть через какие то время ничего нельзя будет

На itmages довольно долго храниться, на всякий случай:

Кнопку сброс можно на мк повесить, если на IBAT = 0 -> раз в ..... её дёргать.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

я основе вашей схемы сделаю свою. вы не против?

но я наверно триггерную схему делать не буду. если пропала проблема пусть сам включается

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

minamonra
Offline
Зарегистрирован: 18.06.2014

Смысл в схеме есть только если есть защита, если больше поинтересуетесь этим вопросом, то подход обычно другой, берётся smps контроллер и уже им управляет мк, .... ну вот например что будет, если мк повиснет? Эти все обсуждения не раз поднимались на других форумах.

Со схемой можно поступать как угодно... ;_)

Но в случае отказа от защиты - во-первых защитить программно - у мк не хватит скорости, во-вторых ставьте быстрый предохранитель.

ы. Деталей-то кот наплакал на защиту...

minamonra
Offline
Зарегистрирован: 18.06.2014

jeka_tm пишет:

если дергать мк то нет ведь смысла делать триггер. смысл пропадает, 

Смысл не пропадает, дергать можно раз в 1 сек, с полевиком ничего не будет, даже если закоротить выход наглухо. Можно подсмотреть реализацию схем защит на 555 таймере в связке шим контроллерами, там подход как раз точно такой же, сработала защита, далее таймер через промежуток времени ее вырубает...

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

вы меня не поняли. я не от защиты собрался отказываться а от тригерной схемы. то есть если напряжение (а он пропорционален току) на управляющем выводе TL431 превысит 2.5В (без учета делителя), то он вырубит полевик. но как только ток упадет полевик снова заработает без ожидания нажатия на кнопку

а уж программно делать регулировку напряжения/тока, так что даже если мк зависнет, ничего сгореть не должно

хотя может и оставлю как есть, все таки даст задуматься что произошло

minamonra
Offline
Зарегистрирован: 18.06.2014

А, понял, имеешь ввиду убрать VT2, а оптрон кинуть в катод TL? Ну тогда да, броски, кз, - спасает TL, остальное программно. Заодно посмотрим как оно.

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

да я эти и имел в виду. поэтому и возник изначально вопрос если такая защита (предполагал транзистор просто как усилитель тока) какой смысл в транзисторе если ток одинаково держат

да посмотрим. по идее тоже самое, но ждать не будет

подскажи как работает в данном случае триггер? точнее результат известен, но схемотехнически непонятно. не приходитлось делать таких триггеров

сейчас доделаю гидропонику (для кролика выращиваю овес в виде зеленого корма, а то мало ли кто что подумает) и отремонтирую самолет (был сильный удар об асфальт. корпус более менее выдержал, а вот с самодельным приемником что то случилось) и займусь схемо. я решил все таки сделать давно задуманное: зарядка для литиевых аккумуляторов с балансером. можно конечно и купить. но думаю все получится. ничего сверхестественного

minamonra
Offline
Зарегистрирован: 18.06.2014

jeka_tm пишет:
подскажи как работает в данном случае триггер? точнее результат известен, но схемотехнически непонятно

Мултивибратор вспомни, ничего не напоминает?

Пока стабилитрон (TL431) закрыт на базе VT2 положительный потенциал, и он закрыт, как только напряжение на ref выводе достигает 2.49 вольт - база транзистора "приземляется", VT2 открывается и сам собой шунтирует (поддерживая на ref напряжение >2.49) пороговое напряжение TL`ки.

minamonra
Offline
Зарегистрирован: 18.06.2014

А как будет правильно подключить меге8 7-ми сегментный 4-ре знака так?

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

это первый вариант. тестировал также без транзисторов и резисторов. тоже работает хорошо, главное время отображения сделать небольшое (время свечения одной цифры при динамической индикации)

но требуется 11 выводов без точки. если нужно съэкономить выводы то можно применить 74HC595

но это постоянно требует процессорное время. лучше применить MAX7219

minamonra
Offline
Зарегистрирован: 18.06.2014

Ладно пока делаю с I2C, а как приедут 7219 соображу что нибудь с ними. Запустил со стабилизацией напряжения, код вот такой:

#include <TimerOne.h>
#include <PWM.h>
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,20,4);
int VBAT = 0;
int VBATmax = 0;
int IBAT = 0;
int OUTVOLT = 400;
int DUTY = 0;
int32_t frequency = 20000; // desired frequency in Hertz
#define PWM_PIN 3          // the output pin for the pwm 
#define  INTERVAL  200UL
static unsigned long PMillis = 300;

void setup () {
 pinMode(0, INPUT);
 pinMode(1, INPUT);
 lcd.init();
 lcd.backlight();
 InitTimers(); 
  bool success = SetPinFrequency(PWM_PIN, frequency);
  if(success) {
    pinMode(13, OUTPUT);
    digitalWrite(13, HIGH);
  } 
}

void loop () {
 VBAT = analogRead(0);
 IBAT = analogRead(1);
 // if (IBAT>CURRENT) DUTY--;
 // if (IBAT<CURRENT) DUTY++;
 if (VBAT>OUTVOLT) DUTY--;
 if (VBAT<OUTVOLT) DUTY++;
 if (VBAT>VBATmax) VBATmax=VBAT;
 if (DUTY>250) DUTY = 250;
 if (DUTY<1)   DUTY = 1;
 pwmWrite(PWM_PIN, DUTY);
 if (millis() - PMillis > INTERVAL) {   
  PMillis = millis();
  lcd.setCursor(0, 0);
  lcd.print("V:"); if (VBAT<1000) lcd.print(0); if (VBAT<100) lcd.print(0); if (VBAT<10) lcd.print(0);
  lcd.print(VBAT); lcd.print(" ");
  lcd.print("I:"); if (IBAT<1000) lcd.print(0); if (IBAT<100) lcd.print(0); if (IBAT<10) lcd.print(0);
  lcd.print(IBAT); lcd.print(" ");
  lcd.setCursor(0, 2);
  lcd.print("D:"); if (DUTY<1000) lcd.print(" "); if (DUTY<100) lcd.print(0); if (DUTY<10) lcd.print(0);
  lcd.print(DUTY);
  lcd.print(" F:"); lcd.print(frequency/1000);lcd.print("kHz");
 }
}

Реакция медленная при подключении нагрузки, те напряжение выравнивает, но медленно.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

а зачем библиотека для шима? в меге8 3 шима хардварных

им также можно частоту поменять. где то ссылки проходили как одной строкой настраивается на другую частоту. правда там частоты вроде 490, 7кгц, 15кгц, 32кгц и 64кгц

изза софтварного шима все замедляется, так как требуется процессорное время

cheshire
cheshire аватар
Offline
Зарегистрирован: 11.07.2014

если я не ошибаюсь есть библиотека где можно Hz точнее настраивать. PWM lib по моему называется или как то так

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

так вот он настроил на нужную частоту чтобы не пищало предполагаю. но софтварный шим нагружает мк чтобы постоянно шимить

cheshire
cheshire аватар
Offline
Зарегистрирован: 11.07.2014

то есть для чайника(ну или для меня), его проблема именно из-за того что он пользуется этой lib?

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

скорее всего да. 20000 раз в секунду нужно подать на порт 1 и 0. как именно портом дергают непонятно в либе. насколько понял используются ардуиновские функции спрятанные внутри digitalWrite. всякие маски и тп

даже управление пинами порта с использование сдвигов требуется 10 мкс вроде насколько помню

в таком случае получается. 20000*2*10мкс=400000мкс=400мс=0,4с. столько нужно в секунду чтобы  делать шим  частотой 20кгц при условии что управление делается сдвигом

а потом еще прибавляем управление i2c дисплеем и получаем что делается медленно

cheshire
cheshire аватар
Offline
Зарегистрирован: 11.07.2014

ясно, в будуйщем буду обращать на это больше внимания

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

cheshire пишет:

ясно, в будуйщем буду обращать на это больше внимания

лучше использовать хардварный шим, либо снижать частоту, либо мирится с тормозами

minamonra
Offline
Зарегистрирован: 18.06.2014

jeka_tm пишет:
а зачем библиотека для шима? в меге8 3 шима хардварных

 

Я же говорил вроде где-то, мк в руки взял первый раз месяц-два назад (hex залить не считается - это не спортивно), решив что хватит быть аналоговым. :_)

jeka_tm пишет:
им также можно частоту поменять. где то ссылки проходили как одной строкой настраивается на другую частоту. правда там частоты вроде 490, 7кгц, 15кгц, 32кгц и 64кгц

На attiny подсказали вот так, но пока без приборов, не видя что там за шим не пробую.

cheshire
cheshire аватар
Offline
Зарегистрирован: 11.07.2014

jeka_tm пишет:

лучше использовать хардварный шим, либо снижать частоту, либо мирится с тормозами

вот если надо чтоб быстро было, лучше как? частоту менять или хв шим?

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

быстро это хардварный. просто настроить на частоту повыше в случае данной темы

процессор не грузит

надо только найти для меги8 настройку  или даташит читать. для 328меги выкладывали

minamonra
Offline
Зарегистрирован: 18.06.2014

jeka_tm пишет:

так вот он настроил на нужную частоту чтобы не пищало предполагаю. но софтварный шим нагружает мк чтобы постоянно шимить

Не, тут не из-за писка, тут КПД и размеры тоже важны. Это для желто-белых колец 15кГц норма, а для феррита надо больше. Вообще нужно не много 15,32,64кГц - уже хорошо, примерно 85,100,125,150кГц бы ещё вообще отлично.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

150кгц? а у вас полевик не сгорит изза переходных процессов? полевик будет греться и кпд упадет

minamonra
Offline
Зарегистрирован: 18.06.2014

Импульсные преобразователи и не на таких частотах работают, другой вопрос самому изготовить допустим 200-300кГц ИИП очень сложно, тут уже больше вопросов к индуктивности, разводке итп.

Кстати, изначально откуда взял идею - avr450 - один работает 15кГц (tiny), второй 100кГц, там и исходники есть.

ы. И да, для чего же тогда драйвер к полевику делал? На 15кГц он и без VT1,VT3,VT4 будет тарахтеть не плохо, ну почти...

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

а вот возмите осциллограф и проверьте фронты

minamonra
Offline
Зарегистрирован: 18.06.2014

Так я не говрил, что на 150кГц буду делать, но иметь возможность попровать-то надо, мало-ли, coilcraft`ом разживусь... :_) А фронты - да первым делом.

minamonra
Offline
Зарегистрирован: 18.06.2014

Пытаюсь разобраться с аппаратным ШИМ, запустил CVAVR мастера, для attiny45, Timer0, 31.250kHz получил такой код:

 

/*******************************************************
This program was created by the
CodeWizardAVR V3.14 Evaluation
Automatic Program Generator
© Copyright 1998-2014 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com

Project : 
Version : 
Date    : 28.08.2014
Author  : 
Company : 
Comments: 


Chip type               : ATtiny45
AVR Core Clock frequency: 8,000000 MHz
Memory model            : Tiny
External RAM size       : 0
Data Stack size         : 64
*******************************************************/

#include <tiny45.h>

// Declare your global variables here

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

// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=(1<<CLKPCE);
CLKPR=(0<<CLKPCE) | (0<<CLKPS3) | (0<<CLKPS2) | (0<<CLKPS1) | (0<<CLKPS0);
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif

// 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: 31,250 kHz
// Mode: Phase correct PWM top=0xFF
// OC0A output: Non-Inverted PWM
// OC0B output: Disconnected
// Timer Period: 16,32 ms
// Output Pulse(s):
// OC0A Period: 16,32 ms Width: 0 us
TCCR0A=(1<<COM0A1) | (0<<COM0A0) | (0<<COM0B1) | (0<<COM0B0) | (0<<WGM01) | (1<<WGM00);
TCCR0B=(0<<WGM02) | (1<<CS02) | (0<<CS01) | (0<<CS00);
TCNT0=0x00;
OCR0A=0x00;
OCR0B=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer1 Stopped
// Mode: Normal top=0xFF
// OC1A output: Disconnected
// OC1B output: Disconnected
// Timer1 Overflow Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
PLLCSR=(0<<PCKE) | (0<<PLLE) | (0<<PLOCK);

TCCR1=(0<<CTC1) | (0<<PWM1A) | (0<<COM1A1) | (0<<COM1A0) | (0<<CS13) | (0<<CS12) | (0<<CS11) | (0<<CS10);
GTCCR=(0<<TSM) | (0<<PWM1B) | (0<<COM1B1) | (0<<COM1B0) | (0<<PSR1) | (0<<PSR0);
TCNT1=0x00;
OCR1A=0x00;
OCR1B=0x00;
OCR1C=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=(0<<OCIE1A) | (0<<OCIE1B) | (0<<OCIE0A) | (0<<OCIE0B) | (0<<TOIE1) | (0<<TOIE0);

// External Interrupt(s) initialization
// INT0: Off
// Interrupt on any change on pins PCINT0-5: Off
GIMSK=(0<<INT0) | (0<<PCIE);
MCUCR=(0<<ISC01) | (0<<ISC00);

// USI initialization
// Mode: Disabled
// Clock source: Register & Counter=no clk.
// USI Counter Overflow Interrupt: Off
USICR=(0<<USISIE) | (0<<USIOIE) | (0<<USIWM1) | (0<<USIWM0) | (0<<USICS1) | (0<<USICS0) | (0<<USICLK) | (0<<USITC);

// 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);
ADCSRB=(0<<ACME);
// Digital input buffer on AIN0: On
// Digital input buffer on AIN1: On
DIDR0=(0<<AIN0D) | (0<<AIN1D);

// ADC initialization
// ADC disabled
ADCSRA=(0<<ADEN) | (0<<ADSC) | (0<<ADATE) | (0<<ADIF) | (0<<ADIE) | (0<<ADPS2) | (0<<ADPS1) | (0<<ADPS0);


while (1)
      {
      // Place your code here

      }
}

Выдернул то, что касается PB0 и таймера, вот так:

void setup()  {
DDRB =  (1<<DDB0);
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 31,250 kHz
// Mode: Phase correct PWM top=0xFF
// OC0A output: Non-Inverted PWM
// OC0B output: Disconnected
// Timer Period: 16,32 ms
// Output Pulse(s):
// OC0A Period: 16,32 ms Width: 0 us
TCCR0A=(1<<COM0A1) | (0<<COM0A0) | (0<<COM0B1) | (0<<COM0B0) | (0<<WGM01) | (1<<WGM00);
TCCR0B=(0<<WGM02) | (1<<CS02) | (0<<CS01) | (0<<CS00);
OCR0A=200;
}
void loop()  {
}

Но, получил 62.5Hz.

TCCR0B отвечает за прескалинг, если в него записать 0x01 или вот так:

TCCR0B=(0<<WGM02) | (0<<CS02) | (0<<CS01) | (1<<CS00);

то частота на PB0 - 15kHz, но почему? Ведь так мы должны получить практически 8MHz.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

а частота работы тиньки какая?

 

minamonra
Offline
Зарегистрирован: 18.06.2014

Бутлоадер 8MHz.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

попробуйте так вместо вашей настройки для 8мгц тиньки без делителя. интересно что получится

TCCR0A=0x83;
TCCR0B=0x0C;
OCR0A=0x1F;

 

minamonra
Offline
Зарегистрирован: 18.06.2014

Залил, частота плавает 3.4MHz в среднем, OCR0A скважнсть не регулирует.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

ну уже не герцы))

блин забыл, вроде OCR0A регулирует скважность

minamonra
Offline
Зарегистрирован: 18.06.2014

У меня на меге8 такая же примерно петрушка, только там получил 46kHz кажется.

Еще вот такой способ (шаманство чистой воды) выдернул откуда-то:

TCCR0B = TCCR0B & 0b11111000 | 0b001 ; // Set pin 5 PWM frequency to 31250 Hz
pinMode(0, OUTPUT);
analogWrite(0, 100);

Выдает 31.25kHz, скважность только с помощью analogWrite, на изменения OCR0A не реагирует.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

OCR0B попробуйте))

minamonra
Offline
Зарегистрирован: 18.06.2014

Ни OCR0A ни OCR0B ... без analogWrite в данном случае на выходе ноль.

ы. Да хватит уже на вы... ;_)