Отправляет email-рассылки с помощью сервиса Sendsay

Статьи по электронике

  Все выпуски  

Статьи по электронике


Информационный Канал Subscribe.Ru


Статьи по электронике.

Статьи по электронике


Сайт рассылки
Автор рассылки

Низкочастотный генератор сигналов произвольной формы.

      Данная программа является примером построения низкочастотного генератора сигналов произвольной формы. Она позволяет выдавать через ШИМ-выход CCP1 сигнал заранее заданной частоты и формы. Форма сигнала задается в табличной форме и может состоять из различного числа выборок (числом не более 255). Число выборок задается в константе SAMPLES. Оно должно быть равно числу строк в соответствующей таблице. Данная программа позволяет генерировать сигналы наиболее распространенных форм: синусоидальной, треугольной и прямоугольной. Выбор формы генерируемого сигнала производится установкой единицы в одну из констант - SIN1, TR1, RECT1.
      Частота сигнала задается в константе FRQ1PWM.
      Сигнал с ШИМ-выхода контроллера должен быть подан на ФНЧ с частотой среза примерно в 2.5 раза превышающей полосу выходного сигнала.
      Если требуется построить перестраиваемый генератор, то к данной программе необходимо добавить подпрограмму расчета значений, загружаемых в счетчик и пользовательский интерфейс.
      Если частота перестраивается в значительном диапазоне, то частота среза фильтра также должна перестраиваться.
      С увеличением частоты и числа выборок точность ее установки уменьшается. Например, при задании частоты 100 Гц с числом выборок 32 реально на выходе
будет 100.03 Гц, а при задании 500 Гц на выходе будет 499.2 Гц


Ниже приводится текст программы
#include p16f877.inc



;Переменные, банк0
cblock 0x20 

CntTMR0 ;Cтарший байт счетчика времени между выборками
CntPWM1 ;Счетчик выборок

FRQ1Lo ;Регистры для хранения значения частоты
FRQ1Hi ;

Temp ;Регистр для хранения данных разного назначения

Flag ;Регистр флагов

endc


;Последние 16 байт: 
W_TEMP EQU 7Dh
STATUS_TEMP EQU 7Eh
PCLATH_TEMP EQU 7Fh


;Константы
Clock EQU .20000000 ;Частота тактового генератора
Tcy EQU Clock/4

;Задание частоты генератора
FRQ1PWM EQU .150 ;Задаваемая частота cигнала генератора в Гц
SAMPLES EQU .32 ;Кол-во выборок на период
;!!! Должно соответствовать таблицам значений выдаваемых сигналов




;Расчет констант для заданной частоты
QSAMPLS1 EQU Tcy/(SAMPLES*FRQ1PWM) ;Частота выборок

if (QSAMPLS1<=.255)
FR1_PWMLo1 EQU .255-QSAMPLS1+.17
FR1_PWMHi1 EQU .1
else
FR1_PWMHi1 EQU QSAMPLS1/.256+1
FR1_PWMLo1 EQU (.255-(QSAMPLS1-(FR1_PWMHi1-1)*.256))+.17
endif

if (FR1_PWMLo1>.255)
FR1_PWMLo EQU FR1_PWMLo1-.256
FR1_PWMHi EQU FR1_PWMHi1-1
else
FR1_PWMLo EQU FR1_PWMLo1
FR1_PWMHi EQU FR1_PWMHi1

endif




;Задание начальной формы генератора:
;Единица соответствует выбранной форме сигнала
#define SIN1 1 ;Синус
#define TR1 0 ;Треугольник
#define RECT1 0 ;Прямоугольник




;Константы для общей инициализации
INIT_PORTA EQU b'00000000'
INIT_PORTB EQU b'00000000'
INIT_PORTC EQU b'00000000'
INIT_PORTD EQU b'00000000'
INIT_PORTE EQU b'00000000'

INIT_OPTION EQU b'10001000' 
INIT_INTCON EQU b'10100000'
INIT_PIE1 EQU b'00000000'

INIT_ADCON0 EQU b'10000001'
INIT_ADCON1 EQU b'10001101';



;Биты Flag:
#define SINUS1 Flag,0
#define TRIANGLE1 Flag,2
#define RECTANGLE1 Flag,4



#define toif INTCON,2





goto Begin

Intrp org 0x4

MOVWF W_TEMP ;Сохранение регистров при прерывании
SWAPF STATUS,W 
CLRF STATUS 
MOVWF STATUS_TEMP
MOVF PCLATH, W 
MOVWF PCLATH_TEMP
CLRF PCLATH

btfss toif
goto rett
bcf toif ;Прерывание от TMR0

decfsz CntTMR0,1 
goto rett

movf FRQ1Lo,0 ;Загрузить данные счетчика
movwf TMR0 ;заново
movf FRQ1Hi,0 ;
movwf CntTMR0 ;


decfsz CntPWM1,1 ;Декремент счетчика выборок
goto Get_Table1
movlw SAMPLES
movwf CntPWM1
Get_Table1

movf CntPWM1,0 ;Загрузить значение выборки
btfsc SINUS1 ;
call SinTable ;Синус
btfsc TRIANGLE1 ;
call TrTable ;Треугольник
btfsc RECTANGLE1 ;
call RectTable ;Прямоугольник
call ChangePWM1 ;Изменить значение ШИМ на выходе


rett
MOVF PCLATH_TEMP, W ;Восстановление регистров после обработки прерывания
MOVWF PCLATH
SWAPF STATUS_TEMP,W 
MOVWF STATUS
SWAPF W_TEMP,F
SWAPF W_TEMP,W
retfie



SinTable
clrf PCLATH
addwf PCL,1
nop
retlw .128 ;0
retlw .153 ;1
retlw .177 ;2
retlw .199 ;3
retlw .218 ;4
retlw .234 ;5
retlw .245 ;6
retlw .253 ;7
retlw .255 ;8
retlw .253 ;9
retlw .245 ;10
retlw .234 ;11
retlw .218 ;12
retlw .199 ;13
retlw .177 ;14
retlw .153 ;15
retlw .128 ;16
retlw .103 ;17
retlw .80 ;18
retlw .58 ;19
retlw .38 ;20
retlw .23 ;21
retlw .11 ;22
retlw .3 ;23
retlw .1 ;24
retlw .3 ;25
retlw .11 ;26
retlw .22 ;27
retlw .38 ;28
retlw .57 ;29
retlw .79 ;30
retlw .103 ;31


TrTable
clrf PCLATH
addwf PCL,1
nop
retlw .0 ;0
retlw .16 ;1
retlw .32 ;2
retlw .48 ;3
retlw .64 ;4
retlw .80 ;5
retlw .96 ;6
retlw .112 ;7
retlw .128 ;8
retlw .143 ;9
retlw .159 ;10
retlw .175 ;11
retlw .191 ;12
retlw .207 ;13
retlw .223 ;14
retlw .239 ;15
retlw .255 ;16
retlw .239 ;17
retlw .223 ;18
retlw .207 ;19
retlw .191 ;20
retlw .175 ;21
retlw .159 ;22
retlw .143 ;23
retlw .128 ;24
retlw .112 ;25
retlw .96 ;26
retlw .80 ;27
retlw .64 ;28
retlw .48 ;29
retlw .32 ;30
retlw .16 ;31












RectTable
clrf PCLATH
addwf PCL,1
nop
retlw .0 ;0
retlw .0 ;1
retlw .0 ;2
retlw .0 ;3
retlw .0 ;4
retlw .0 ;5
retlw .0 ;6
retlw .0 ;7
retlw .0 ;8
retlw .0 ;9
retlw .0 ;10
retlw .0 ;11
retlw .0 ;12
retlw .0 ;13
retlw .0 ;14
retlw .0 ;15
retlw .255 ;16
retlw .255 ;17
retlw .255 ;18
retlw .255 ;19
retlw .255 ;20
retlw .255 ;21
retlw .255 ;22
retlw .255 ;23
retlw .255 ;24
retlw .255 ;25
retlw .255 ;26
retlw .255 ;27
retlw .255 ;28
retlw .255 ;29
retlw .255 ;30
retlw .255 ;31




;Общая инициализация
Init
BSF STATUS,RP0
BCF STATUS,IRP
BCF STATUS,RP1
MOVLW INIT_PORTA
MOVWF TRISA^80h
MOVLW INIT_PORTB
MOVWF TRISB^80h
MOVLW INIT_PORTC
MOVWF TRISC^80h
MOVLW INIT_PORTD
MOVWF TRISD^80h
MOVLW INIT_PORTE
MOVWF TRISE^80h
MOVLW INIT_OPTION
MOVWF OPTION_REG^80h
movlw INIT_PIE1 
movwf PIE1^80h
clrf PIE2^80h
movlw INIT_ADCON1 
movwf ADCON1^80h
BCF STATUS,RP0
movlw INIT_INTCON
movwf INTCON
movlw INIT_ADCON0 
movwf ADCON0 
RETURN





Init_PWM
movlw .64;
bsf STATUS,RP0
movwf PR2^80h
bcf STATUS,RP0
movlw b'00000001'
movwf CCPR1L
bcf CCP1CON,5
bsf CCP1CON,4
movlw b'00000000'
movwf CCPR2L
bcf CCP2CON,5
bsf CCP2CON,4
movlw b'00000100'
movwf T2CON
movlw 0x0f
iorwf CCP1CON,1
movlw 0x0f
iorwf CCP2CON,1
return



ChangePWM1
movwf Temp
bcf STATUS,C
rrf Temp,1
bcf CCP1CON,5
bcf CCP1CON,4
btfsc STATUS,C
bsf CCP1CON,4
bcf STATUS,C
rrf Temp,0
btfsc STATUS,C
bsf CCP1CON,5
movwf CCPR1L
return



Begin

movlw 1 ;Загрузить начальное значение счетчика
movwf CntPWM1 ;
movwf CntTMR0 ;

clrf Flag ;


movlw FR1_PWMHi ;Загрузить значение констан
movwf FRQ1Hi ;для заданной частоты
movlw FR1_PWMLo ;
movwf FRQ1Lo ;



if (SIN1) ;Установить флаг, соответствующий
bsf SINUS1 ;выбранной форме сигнала
endif ;
if (TR1) ;
bsf TRIANGLE1 ;
endif ;
if (RECT1) ;
bsf RECTANGLE1 ;
endif ;


call Init ;Инициализация
call Init_PWM ;


goto $ ;















end

НачалоНачало

http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу

В избранное