sat387 писал(а):прошивку вашу проверил напряжение 36В соответствует, а ток который можно максимально выставить равен 989 без запятых
Проверьте эту.
sat387 писал(а):у меня цель немного друая, сделать универсальный источник питания током так на 3А но чтобы было два диапазона mA и A
Лучше сделайте два разных источника питания. Источников никогда много не бывает. Увидите, что так намного удобней. А делать оптом почти одинаковые приборы всегда легче. Я именно так для себя и решил, делаю 2 шт. PSL-2401, 1 шт. PSL-3604 и, возможно, 1 шт. ключевой PSL-2020.
sat387 писал(а):но увы прошивки пока нет
Вы про какую плату? Для PSL-3604 на STM32? Этой прошивки ждать не стоит. А вот для версии на AVR она может появиться. Хотя тут тоже проблемы. Человек выслал мне по почте внешний АЦП, котрый там нужен, но я так и не смог получить посылку. У нас на почте - дурдом, всегда огромная очередь на много часов. Я 4 раза туда ходил, тратил всё имеющееся время, но так и не смог подойти к кассе. Посылка пошла обратно. Судьба заставляет делать на STM32?
Что касается текущей версии платы для PSL-2401, прошивку для которой высылаю, так я ее тоже очень хочу выбросить и сделать по-другому, так как выявлен ряд недостатков. Но и в новой версии будет использован ШИМ-ЦАП и встроенный 10-разрядный АЦП. Кстати, насчет ЦАП. А не лучше ли будет вместо 14-разрядного ШИМ использовать 8-разрядный с программным "довеском" до 14-16 бит в виде дельта-сигма?
Код: Выделить всё
//----------------------------- Constants: -----------------------------------
#define PWM_MAX 0xFF00 //PWM full scale
#define FINE_PWM_MAX 0x0100 //fine PWM full scale
//----------------------------- Variables: -----------------------------------
static unsigned int Pwm; //current PWM value
//------------------------- Function prototypes: -----------------------------
#pragma vector = TIMER2_OVF_vect
__interrupt void Pwm_Cycle(void); //timer 2 overflow
//-------------------------- PWM module init: --------------------------------
void Pwm_Init(void)
{
//timer 2 mode: fast PWM, set OC2 on compare match, CK/1
TCCR2 = (1 << WGM21) | (1 << WGM20) | (1 << COM21) | (1 << COM20) | (1 << CS20);
TIFR = (1 << TOV2); //pending interrupts clear
TIMSK |= (1 << TOIE2); //overflow interrupt enable
}
//----------------------- Timer 2 overflow interrupt: ------------------------
#pragma vector = TIMER2_OVF_vect
__interrupt void Pwm_Cycle(void)
{
//Delta-Sigma modulator:
static int Sigma = 0;
int Delta;
//quantization:
if(Sigma > FINE_PWM_MAX)
{
Delta = -FINE_PWM_MAX;
OCR2 = 0xFE - HI(Pwm);
}
else
{
Delta = 0;
OCR2 = 0xFF - HI(Pwm);
}
//summing:
Sigma = Sigma + LO(Pwm) + Delta;
}
//-------------------------------- Set PWM: ----------------------------------
void Pwm_Set(unsigned int v)
{
if(v > PWM_MAX) v = PWM_MAX;
Pwm = v;
}
//-------------------------------- Get PWM: ----------------------------------
unsigned int Pwm_Get(void)
{
return(Pwm);
}
//----------------------------------------------------------------------------