четверг, 14 августа 2008 г.

USB библиотека под AT90USBxxx

Вот, дописал кое как библиотеку для USB под AT90USB1287 (но несложно и под другие переделать).
Чтоб заработал USB добавте в проект файлы USBD.c USB_cdc_user_functions.c PLL.c.
В вашей программе добавте #include "usbd.h"
и вызовите START_PLL_and_USB_module();
В USB_cdc_user_functions.c есть функция callback_USB_RXC которая вызываеться при приходе пакета данных по CDC.
В примере там просто пересылка их обратно (Эхо).
Все проверено на AT90USBKey и имейте в виду что бит UVREGE нужно выставлять только если у вас USB модуль питаеться от внутреннего регулятора, иначе его надо погасить. При обнаружении девайса, подсунуть ей файл at90usbxxx_powerc.inf в папке Driver
Да, и компилилось все под IAR 5.11B
Собственно саму библиотеку с примером можно забрать сдесь https://sites.google.com/a/powerc.ru/powerc/instrukcii/USB_LIBRARY.7z?attredirects=0&d=1

понедельник, 4 августа 2008 г.

Вариант измерения напряжения в широком диапазоне




Измеряеться напряжение Vsense при помощи АЦП питаемого от источника Vmcu 5V АЦП подключаем к точке соеденения резисторов R5 и R8, В данном случае затвор поднключен к Vmcu так как входной сигнал большой, а вообще он должен управляться микроконтроллером. диод должен быть с очень маленьким падением напряжения, он предохраняет АЦП от перегрузки.

пятница, 4 июля 2008 г.

Понижающие конвертер на IR3637A для высокого входного напряжения



Столкнувшись с проблеммой выбора недорогого, синхронного, высокочастотного понижающего контроллера, я разработал вот такую схемку. Идея ее в том чтоб использовать дешевый контроллер IR3637A. Питание до стабильной работы схема получает от стабилизатора, а после запуска, с выхода. В качестве start-up схемы, можно использовать и стабилитрон тоб дешевле было. Трансформатор есть дешевый готовый. В таком варианте конвертер получается дешевле чем на IR3651 и частота на 200 килогерц выше.

понедельник, 17 марта 2008 г.

Защита от перегрузки по току на ACS712



Передо мной встала задача – организовать защиту от перегрузки по току на микросхеме ACS712/ACS713. Быстродействие – до 500 микросекунд.

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

Вот что получилось.

Смоделировано в OrCAD Pspice 10.3.0

Сенсор на эффекте холла ACS712 (100mV/A, 0A = 2.5V, Vout=I*0,1+2.5V) заменен источником VPULSE V2 – при токе 5A на нем около 3V при токе 11A – 3.6V – это и есть порог срабатывания защиты.

На сдвоенном ОУ U2 LM358 организовано два буфера – один для получения опорного напряжения, второй – для буферизации выхода сенсора тока и подачи его на внешнюю схему для измерения потребляемого тока.

Для получения опорного напряжения используется делитель на резисторах R3, R4. C1, C2, R5 – призваны фильтровать помехи по цепи питания, в дальнейшем R3 и R4 предполагается заменить цифровым потенциометром для регулировки порога срабатывания защиты.

На компараторе U1 LM393 реализован пороговый компаратор. Конденсатор C3 сглаживает высокочастотные переходные процессы.

На транзисторах Q3 и Q5 реализовано защелкивание защиты, Q4 сбрасывает защиту.

На источнике V3 эмулируется сигнал сброса защиты от внешней схемы.


пятница, 14 марта 2008 г.

Браузер Safari

Поставил сегодня браузер Safari, работает быстро и красивый!

вторник, 22 января 2008 г.

Дуплекс на отражение



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

среда, 16 января 2008 г.

Итак есть 3 функции - 2 из них вызываем из основного кода
Запускаем АЦП, ждем когда будет нужное количество выборок,
останавливаем АЦП вычисляем энергию сигнала - calc_energy
Пропускаем через герцель - goertzel_calc.
Далее в зависимости от энергии и результата герцеля делаем вывод, есть частота али нет.

----------------------------------------------------------
NAME goertzel
PUBLIC goertzel_calc
PUBLIC calc_energy
#include "ioavr.h"

#define coeffa_H YH //Коэфициент альфа
#define coeffa_L YL //

#define D0_H r12 //Результат
#define D0_L r13 //D0 16 бит

#define D1_H r26 //Результат
#define D1_L r27 //D1 16 бит

#define D2_H r14 //Результат
#define D2_L r15 //D2 16 бит

#define X_L r0 //
#define X_H r1 //

#define temp2 r2
#define temp3 r3

#define general_temp r16
#define counter_register r17

//ZH:ZL буффер значений
//YH:YL коэфициент альфа

RSEG CODE
//--------------------------------------------------------------------------//
// Входные параметры - char * Указатель на буффер 2 байта (r16-r17 //
// char - размер буффера - 1 байт (r18) //
// unsigned int coeff_a - 2 байта (r20,r21), коэфициент альфа //
// Возрат - unsigned long вычисленная мощность частоты (r16 - r19) //
goertzel_calc:
push r22
in r22,SREG
push r22

push r0
push r1
push r2
push r3
push r4
push r5
push r6
push r7
push r8
push r9
push r10
push r11
push r12
push r13
push r14
push r15

push r23
push r24
push r25
push r26
push r27
push r28
push r29
push r30
push r31

//--------------------------
clr D0_H
clr D0_L
clr D1_H
clr D1_L
clr D2_H
clr D2_L

//-----------------------------------------------------------------------------
//
mov coeffa_H,r21 //Загрузка
mov coeffa_L,r20 //коэффициента альфа
mov ZL, r16 //Адрес буффера
mov ZH, r17 //2 байта
mov counter_register,r18 //Количество выборок - второй параметр (r18)
cloop:
push counter_register
ld X_L,Z+
clr X_H
ldi general_temp,0x7F
sub X_L,r16
clr general_temp
sbc X_H,general_temp

//D0 = (X + (a1 * D1)) - D2
//D2 = D1
//D1 = D0
//
//P = D1*D1 + D2*D2 - a1*D1*D2
//-------------------------------

//calc D0
mov r21,coeffa_H
mov r20,coeffa_L
mov r23,D1_H
mov r22,D1_L
rcall muls16x16_32
mov D0_H,r18
mov D0_L,r17

add D0_L,X_L
adc D0_H,X_H

sub D0_L,D2_L
sbc D0_H,D2_H
//-------------------------------

//calc D2
mov D2_H,D1_H
mov D2_L,D1_L

//calc D1
mov D1_H,D0_H
mov D1_L,D0_L

pop counter_register
dec counter_register
brne cloop

rcall calc_power

pop r31
pop r30
pop r29
pop r28
pop r27
pop r26
pop r25
pop r24
pop r23

pop r15
pop r14
pop r13
pop r12
pop r11
pop r10
pop r9
pop r8
pop r7
pop r6
pop r5
pop r4
pop r3
pop r2
pop r1
pop r0


pop r22
out SREG,r22
pop r22
ret

//--------------------------------------

calc_power:
push r4
push r5
push r6
push r7

//calc Power
//D1*D1 + D2*D2 -a1*D1*D2
//calc D1^2
mov r21,D1_H
mov r20,D1_L
mov r23,D1_H
mov r22,D1_L
rcall muls16x16_32
mov r3,r19
mov r2,r18
mov r1,r17
mov r0,r16

//calc D2^2
mov r21,D2_H
mov r20,D2_L
mov r23,D2_H
mov r22,D2_L
rcall muls16x16_32
mov r7,r19
mov r6,r18
mov r5,r17
mov r4,r16

//calc a1 * D1 * D2
mov r21,coeffa_H
mov r20,coeffa_L
mov r23,D1_H
mov r22,D1_L
rcall muls16x16_32
mov r21,r18
mov r20,r17
mov r23,D2_H
mov r22,D2_L
rcall muls16x16_32

//calc (D2^2) - (a1*D1*D2)
sub r4,r16
sbc r5,r17
sbc r6,r18
sbc r7,r19

//calc D1*D1 + (D2*D2 - a1*D1*D2)
add r4,r0
adc r5,r1
adc r6,r2
adc r7,r3

mov r19,r7
mov r18,r6
mov r17,r5
mov r16,r4

pop r7
pop r6
pop r5
pop r4
ret

//--------------------------------------------------//
// r19:r18:r17:r16 = r23:r22 * r21:r20 //
//--------------------------------------------------//
muls16x16_32: //Умножение 16bit на 16bit результат 32bit
push r0
push r1
push r2

clr r2
muls r23,r21 //(signed)ah * (signed)bh
movw r19:r18,r1:r0 //Результат в r19:r18
mul r22,r20 //al * bl
movw r17:r16,r1:r0 //Результат в r17:r16
mulsu r23,r20 //(signed)ah * bl
sbc r19,r2 //
add r17,r0 //
adc r18,r1 //
adc r19,r2 //
mulsu r21,r22 //(signed)bh * al
sbc r19,r2 //
add r17,r0 //
adc r18,r1 //
adc r19,r2 //

pop r2
pop r1
pop r0
ret
//--------------------------------------------------------------------------//
// Входные параметры - char * Указатель на буффер 2 байта (r16-r17) //
// char - размер буффера - 1 байт (r18) //
// Возрат - unsigned long вычисленная сигнала (r16 - r19) //
calc_energy:
push r22
in r22,SREG
push r22

push r0
push r1
push r2
push r3
push r4
push r5
push r6
push r7
push r8
push r9
push r10
push r11
push r12
push r13
push r14
push r15
push r20
push r21
push r23
push r24
push r25
push r26
push r27
push r28
push r29
push r30
push r31

mov ZL, r16 //Адрес буффера
mov ZH, r17 //2 байта
mov counter_register,r18 //Количество выборок - второй параметр (r18)
clr D0_H
clr D0_L
clr D2_H
clr D2_L

cloop2:
push counter_register
ld X_L,Z+
clr X_H
ldi general_temp,0x7F
sub X_L,r16
clr general_temp
sbc X_H,general_temp

mov r21,X_H
mov r20,X_L
mov r23,X_H
mov r22,X_L

rcall muls16x16_32

add D0_L,r16
adc D0_H,r17
adc D2_L,r18
adc D2_H,r19

pop counter_register
dec counter_register
brne cloop2

mov r16,D0_L
mov r17,D0_H
mov r18,D2_L
mov r19,D2_H

pop r31
pop r30
pop r29
pop r28
pop r27
pop r26
pop r25
pop r24
pop r23
pop r21
pop r20

pop r15
pop r14
pop r13
pop r12
pop r11
pop r10
pop r9
pop r8
pop r7
pop r6
pop r5
pop r4
pop r3
pop r2
pop r1
pop r0

pop r22
out SREG,r22
pop r22
ret

END