Микроконтроллеры

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Микроконтроллеры » RA » Повышающий преобразователь. stm8s.


Повышающий преобразователь. stm8s.

Сообщений 31 страница 43 из 43

31

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

32

MasterElectric спасибо, я именно так и думал. что это имеет значение только при работе с внешними устройствами. так и осталась у меня загадка с моим union. у меня в пределах одной архитектуры одни объединения нормально работали, а одно что-то не то... может лыжи конечно не смазал.  :D

33

MasterElectric написал(а):

В пределах одной архитектуры по идее разницы нет

Да какбэ и не совсем так... Обычная конструкция типа...

*(__IO uint8_t *)((uint16_t)&(var) + 1)

вернёт совсем не старший байт...

34

Дошло. Спасибо HHIMERA.

35

1)В очередной раз разобравшись с преобразователем, определив причины подыхания оного, которые заключались в межвитковом коротыше индуктивности, что было следствием её поджарки, из-за не включенного оптион бита - продолжение работы таймера при останове на дебаг-брейк пойнт, пришел к выводу, что он мне НЕ НУЖЕН. Дурная голова не только ногам покоя не даёт, но и позволяет получить бесценный опыт, тогда когда он не нужен и затянуть очень сильно по-времени по-сути плевое дело. Но оно заработало как надо выжать получалось на 5-и вольтах 0,5А с пульсациями 100мВ, при входном от 3В до 4,2В. Сильнее нагружать не пробовал - нечем.
2)max232 Генератор Кокрофта-Уолтона для пищалки тоже не нужен. Эффект такой же http://www.avislab.com/blog/piezo-buzzer_ru/, громче не орет, все таки 100 Омовый внутренний ограничитель свое дело делает. Проще мосфит взять на 32 вольта ( :) можно и на 100В ) рабочего и накачать на нем до потолка, пока не разрушится  :crazy:
3) в итоге схема девайса такова. http://sg.uploads.ru/t/rMToX.png

4)Зато все функции на периферии, акромя зарядки аккума... пока что...

36

HHIMERA написал(а):

Да какбэ и не совсем так... Обычная конструкция типа...

*(__IO uint8_t *)((uint16_t)&(var) + 1)

вернёт совсем не старший байт...

По сути получается массив из двух элементов(char) к которому можно обратиться как к одному целому(int), или многомерный массив [один int][два char], где int = char1 + char2 ???

37

Для малых индейцев...

a = *(__IO uint8_t *)((uint16_t)&(var) + 1);

получим старший байт переменной var...

В СТМ8 - младший байт...

38

ну тогды union описанный структурой типа

Код:
union type_timer2_arr
{
  unsigned int arr;  
  struct
  {
    unsigned int l_arr : 8;
    unsigned int h_arr : 8;
  };
} timer2_arr;

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

39

Не вижу смыла открывать новую тему. Переехал бустер - питающие напряжение в [нужное] - на стм32ф100рб. И получилась настоящая хня. Транзюки дохнут. То ли во время пайки, чего раньше не происходило, то ли после после подачи 1-0 на вход. Не знаю... осциллограф нужен. Подумал, подумал решил на биполярнике замутить. Замутил на транзисторе 2SC4672. http://www.secosgmbh.com/datasheet/prod … SC4672.pdf Совершенно не понятно почему его в низкочастотные записали... Напряжение насыщения 0,35В максимум. Что очень даже не плохо. Чисто теоретически достаточно 20мА для включения. hFE от 80 до 390.
Испытал... Индуктивность 2200мкГн, сопр постоянка порядка 45 ом. Ну с 4.6 поднял до без чуть, чуть 6 вольт. А надо сделать размах до не менее 10вольт. Буду играть с током базы(путем добавления еще одного канала шим) и индуктивностью. Ток базы увеличивать, индуктивность уменьшать. Что там с частотой шима - будет видно дальше, сейчас играюсь на 100кГц, видимо необходимое время заряда :) индуктивности значительно больше чем я его отвожу на заряд. :) Простите за туфтологию, заряд индуктивности - имеется ввиду время достижения максимального тока, ну практически максимального, точнее 0,9Imax
http://sd.uploads.ru/t/jFvtr.png

Код:
#include "stm32f10x.h"
#include "define.h"

volatile uint16_t buf0;
volatile uint16_t buf1;
volatile uint16_t buf2;
int main()
{
	RCC->APB1ENR |= RCC_APB1ENR_TIM2EN;
	RCC->APB2ENR |= RCC_APB2ENR_IOPAEN | RCC_APB2ENR_IOPCEN | RCC_APB2ENR_AFIOEN;
	GPIOA->CRL = (GPIOA->CRL & ~(GPIO_CRL_MODE0 | GPIO_CRL_CNF0)) | GPIO_CRL_MODE0_1 | GPIO_CRL_CNF0_1;

	GPIOA->CRL = (GPIOA->CRL & ~(GPIO_CRL_MODE1 | GPIO_CRL_CNF1)) | GPIO_CRL_CNF1_0;
	GPIOA->CRL = (GPIOA->CRL & ~(GPIO_CRL_MODE2 | GPIO_CRL_CNF2)) | GPIO_CRL_CNF2_0;
	
//	DBGMCU->CR |= DBGMCU_CR_DBG_TIM2_STOP;
	
	led_blue_init;
	led_green_init;
	
	TIM2->PSC = 0;
	TIM2->ARR = 240-1;
	TIM2->CCR1 = 120;
	TIM2->CCR2 = 120;

	TIM2->CCER |= TIM_CCER_CC1E;
	TIM2->CCMR1 |= TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_1;

	TIM2->CCER |= TIM_CCER_CC2E;
	TIM2->CCMR1 |= TIM_CCMR1_OC2M_2 | TIM_CCMR1_OC2M_1;    
//	TIM2->CCMR1 |= TIM_CCMR1_CC2S_0;
//	TIM2->CCER |= TIM_CCER_CC2E;
    
//	TIM2->CCMR2 |= TIM_CCMR2_CC3S_0;
//	TIM2->CCER |= TIM_CCER_CC3E;         
//	TIM2->CCER |= TIM_CCER_CC3P;
	
	TIM2->EGR |= TIM_EGR_UG; 
	asm("nop");
  asm("nop");
	TIM2->SR = 0;
	
//	TIM2->DIER |= TIM_DIER_UIE;
//	TIM2->DIER |= TIM_DIER_CC2IE;
//	TIM2->DIER |= TIM_DIER_CC3IE;
//	NVIC_SetPriority(TIM2_IRQn,0);
//	NVIC_EnableIRQ(TIM2_IRQn);
	
	TIM2->CR1 |= TIM_CR1_CEN;

  while(1) {led_blue_on;}
}
void TIM2_IRQHandler (void)
{
	if( TIM2->SR & TIM_SR_UIF ){
    TIM2->SR = ~TIM_SR_UIF;
    buf0 = (buf2 - buf1)>>5;
	}
	if( TIM2->SR & TIM_SR_CC2IF ){
    TIM2->SR = ~TIM_SR_CC2IF;
    buf1 = TIM2->CCR2;
	}
	if( TIM2->SR & TIM_SR_CC3IF ){
    TIM2->SR = ~TIM_SR_CC3IF;
    buf2 = TIM2->CCR3;
	}
}

2 пина шима, напряжение поднялось ... чуть... значит тока базы хватает.
берем индуктивность те же 2200мкГн, но постоянным сопротивлением поменьше, провод потолще :) . И вот уже 10,15 Вольт из 4,6 Вольт. Ближе к телу...
Увеличиваю заполнение шима

TIM2->PSC = 0;
TIM2->ARR = 240;
TIM2->CCR1 = 160;

и вот 12,62 Вольта.
индуктивность то ли 30мкГн, то ли 56мкГн, точно не знаю может и 10.

Код:
	TIM2->PSC = 0;
	TIM2->ARR = 240;
	TIM2->CCR1 = 40;

12,68 Вольт еще растет если время заряда увеличить, но уже грется начинает и подымается слабо. короче что мне нужно было я добился. теперь надо синусоиду(что то близкое) с частой для начала 10Гц и амплитудой от +3(минимальное значение) до +10 Вольт(максимальное).

40

Код:
#include "stm32f10x.h"
#include "define.h"

volatile uint16_t buf0;
volatile uint16_t buf1;
volatile uint16_t buf2;
volatile uint32_t nf = 0;
volatile uint32_t filling = 0;
volatile uint32_t tone = 0;
volatile uint32_t nt = 0;

int main()
{
/////////////////////////////////////////////////////////////////////////////////////////
	RCC->APB1ENR |= RCC_APB1ENR_TIM2EN;
	RCC->APB1ENR |= RCC_APB1ENR_TIM3EN;
	RCC->APB2ENR |= RCC_APB2ENR_IOPAEN | RCC_APB2ENR_IOPCEN | RCC_APB2ENR_AFIOEN;
////////////////////////////////////////////////////////////////////////////////////////	
	GPIOA->CRL = (GPIOA->CRL & ~(GPIO_CRL_MODE0 | GPIO_CRL_CNF0)) | GPIO_CRL_MODE0_1 | GPIO_CRL_CNF0_1;
	GPIOA->CRL = (GPIOA->CRL & ~(GPIO_CRL_MODE6 | GPIO_CRL_CNF6)) | GPIO_CRL_MODE6_1 | GPIO_CRL_CNF6_1;
/////////////////////////////////////////////////////////////////////////////////////////	
	led_blue_init;
	led_green_init;
	TIM2->PSC = 0;
	TIM2->ARR = 240-1;
	TIM2->CCR1 = 40;
/////////////////////////////////////////////////////////////////////////////////////////	
	TIM2->CCER |= TIM_CCER_CC1E;
	TIM2->CCMR1 |= TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_1;
/////////////////////////////////////////////////////////////////////////////////////////
	TIM2->DIER |= TIM_DIER_UIE;
	NVIC_SetPriority(TIM2_IRQn,0);
	NVIC_EnableIRQ(TIM2_IRQn);
/////////////////////////////////////////////////////////////////////////////////////////
	TIM2->EGR |= TIM_EGR_UG; 
	asm("nop");
  asm("nop");
	TIM2->SR = 0;
/////////////////////////////////////////////////////////////////////////////////////	
	TIM3->PSC = 24-1;
	TIM3->ARR = 360;
	TIM3->CCR1 = 150;
	TIM3->CR1 |= TIM_CR1_ARPE ;
	TIM3->CCER |= TIM_CCER_CC1E;
	TIM3->CCMR1 |= TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_1;
/////////////////////////////////////////////////////////////////////////////////////////
	TIM3->DIER |= TIM_DIER_UIE;
	NVIC_SetPriority(TIM3_IRQn,0);
	NVIC_EnableIRQ(TIM3_IRQn);
/////////////////////////////////////////////////////////////////////////////////////////
	TIM3->EGR |= TIM_EGR_UG; 
	asm("nop");
  asm("nop");
	TIM3->SR = 0;
/////////////////////////////////////////////////////////////////////////////////////
	TIM2->CR1 |= TIM_CR1_CEN;
	TIM3->CR1 |= TIM_CR1_CEN;
/////////////////////////////////////////////////////////////////////////////////////
  while(1) {led_blue_off;}
}
void TIM2_IRQHandler (void)
{
	if( TIM2->SR & TIM_SR_UIF ){
    TIM2->SR = ~TIM_SR_UIF;
    ++nf;
    if( nf == 400 ){
    	if(  filling < 40){
        led_blue_on;
        TIM2->CCR1 = ++filling ;
    	}
    	else{
        filling = 0;
    	}
    	nf = 0;
    }	
	}
}
void TIM3_IRQHandler (void)
{
	if( TIM3->SR & TIM_SR_UIF ){
    TIM3->SR = ~TIM_SR_UIF;
    if( (tone >= 350) && ( tone <= 380 )){
    	TIM3->ARR = ++tone ;
    }
    else{
    	tone = 350;
    }
	}
}

:) пол периода синусоиды. теоретически синусоида будет получатся на бипере при при прямом счете от 0 до макс. и обратно к нулю. Вообщем эффект интересный.
http://sg.uploads.ru/t/oa16x.png
осенило!!! как проверить что я там модулирую без осциллографа. микрофон... банальный микрофон... смарт, записать звук, найти чем посмотреть графически(может кто что подскажет? AudioTools...), определить модуляцию на 500 Гц, на 400, на 300, 200, 100... рассчитать на 6,5 Гц, добавить плавание частоты  -/+ 1Гц.
соседей жалко.  :blush:
нашел прогу https://play.google.com/store/apps/deta … .osciprime
https://play.google.com/store/apps/deta … ciprimeics
https://play.google.com/store/apps/deta … &hl=en
отдельно
https://play.google.com/store/apps/deta … dio.oscope
вопрос теоретический два пьезоизлучателя как лучше включать? последовательно || параллельно? с точки зрения получения максимальных децибел.
"вызывающего болевые ощущения, составляет примерно 120 дБ. Например, утверждение «громкость звука составляет 30 дБ» означает, что интенсивность звука в 1000 раз превышает порог слышимости звука человеком."https://ru.wikipedia.org/wiki/%D0%94%D0%B5%D1%86%D0%B8%D0%B1%D0%B5%D0%BB
один где-то  90 дает, думаю 90+90 тут не проканают... можно и три ... как прикинуть сколько попугаев надо?
http://avr-start.ru/?p=749

41

:tomato:  стм32ф100рб убил. прошивальщик работает, внешнее шьет и диск создает, а вот стм32ф100рб не видет. а оный греется адско. и стаб греется. убил статикой.  :crazy: слышно было и видно.
переехал на алиблюпил.

Код:
#include "stm32f10x.h"
//#include "usblib.h"
#include "define.h"
#include <math.h>

volatile uint16_t buf0;
volatile uint16_t buf1;
volatile uint16_t buf2;
_Bool button1;
_Bool button2;
_Bool button3;
uint32_t nf = 0;
uint32_t nz = 0;
uint32_t filling = 0;
uint32_t tone = 0;
uint32_t up_down = 0;
uint32_t up_downz = 0;
uint32_t n_sens1 = 0;
uint32_t n_sens2 = 0;
uint32_t n_sens3 = 0;
uint32_t syst = 0;
uint8_t sin_dac[200];
uint8_t i=0;
uint8_t amplituda;
uint32_t x = 0;


int main(void)
{
	for(i=0;i<=200;++i){
if(i<=100){sin_dac[i]=++amplituda;}
if(i>=100){sin_dac[i]=--amplituda;}
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////AHB = 72MHz; APB1 = 36MHz; ARB2 = 72MHz////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  RCC->APB2ENR |= 
	RCC_APB2ENR_IOPAEN | /*PORTA CLK ON */
	RCC_APB2ENR_IOPBEN | /*PORTB CLK ON */
	RCC_APB2ENR_IOPCEN | /*PORTC CLK ON */
	RCC_APB2ENR_AFIOEN | /*Alternate functions CLK ON */
	RCC_APB2ENR_TIM1EN /*TIMER1 CLK ON */
	;
	RCC->APB1ENR |= 
	RCC_APB1ENR_TIM2EN | /*TIMER2 CLK ON */
	RCC_APB1ENR_TIM3EN | /*TIMER3 CLK ON */
	RCC_APB1ENR_TIM4EN   /*TIMER4 CLK ON */
	;
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//GPIO_CRL_MODEx > 0 : OUTPUT
//GPIO_CRL_MODEx01 : Maximum output speed 10 MHz
//GPIO_CRL_MODEx10 : Maximum output speed 2 MHz
//GPIO_CRL_MODEx11 : Maximum output speed 50 MHz
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//GPIO_CRL_CNFx_1 = 1 : Alternate Function output	PP
//GPIO_CRL_CNFx_1 = 0 : General purpose output
//GPIO_CRL_CNFx_0 = 1 : Open-drain
//GPIO_CRL_CNFx_0 = 0 : Push-pull
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//GPIO_CRL_MODEx = 0 : INPUT
//GPIO_CRL_CNFx_1 = 0 & GPIO_CRL_CNFx_0 = 0 : Analog INPUT	
//GPIO_CRL_CNFx_1 = 0 & GPIO_CRL_CNFx_0 = 1 : Input floating
//GPIO_CRL_CNFx_1 = 1 & GPIO_CRL_CNFx_0 = 0 & PxODR.PIN=0 : Input pull-down
//GPIO_CRL_CNFx_1 = 1 & GPIO_CRL_CNFx_0 = 0 & PxODR.PIN=1 : Input pull-up	
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/*PA.0*/                                                        	/*PA.0(PWM TIM2 CH1)*/
	GPIOA->CRL = (GPIOA->CRL & ~(GPIO_CRL_MODE0 | GPIO_CRL_CNF0)) | /*clear mode pin PA.0 to 0*/
	GPIO_CRL_MODE0_1 |                                             	/*Maximum output speed 2 MHz*/
	GPIO_CRL_CNF0_1                                                 /*Alternate Function output*/
	;
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/*PA.6*/                                                        	/*PA.6(PWM TIM3 CH1)*/	
	GPIOA->CRL = (GPIOA->CRL & ~(GPIO_CRL_MODE6 | GPIO_CRL_CNF6)) | /* clear mode pin PA.6 to 0*/
	GPIO_CRL_MODE6_1 |                                             	/*Maximum output speed 10 MHz*/
	GPIO_CRL_CNF6_1                                               	/*Alternate Function output*/
	;
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/*PC.8 LED(define.h)*/
//	led_blue_init;
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/*PC.9 LED(define.h)*/
	led_green_init;
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/*PC.10 LED(define.h)*/
//	led_red_init;
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////ПРИМЕР -- TIMER 4: CH4 - A.3(capture/PWM/OFF)///////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////    
////////////////////////TIMER 4: CH4 - B.9(OFF); CH3 - B.8(OFF); CH2 - B.7(OFF); CH1 - B.6(OFF);////////////////////////////
////////////////////////TIMER 3: CH4 - B.1(OFF); CH3 - B.0(OFF); CH2 - A.7(OFF); CH1 - A.6(OFF);////////////////////////////
////////////////////////TIMER 2: CH4 - A.3(OFF); CH3 - A.2(OFF); CH2 - A.1(OFF); CH1 - A.0(OFF);////////////////////////////
////////////////////////TIMER 1: CH4 - A.11(OFF); CH3 - A.10(OFF); CH2 - A.9(OFF); CH1 - A.8(OFF);//////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /* =========== TIM1 ========== */
//TIMER 1: CH4 - A.11(OFF); CH3 - A.10(OFF); CH2 - A.9(OFF); CH1 - A.8(OFF);

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////*TIMER2 INIT*///////////////////////////////////////////////////////////
///////////////////////////////////////*BOOSTER CONVERTER 3-4.2VOLT to 12VOLT*//////////////////////////////////////////////
/////////////////////*TIMER 2: CH4 - A.3(OFF); CH3 - A.2(OFF); CH2 - A.1(OFF); CH1 - A.0(PWM);*/////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//клок таймера 72МГц если делитель APB1 = 1 то множитель 1. иначе *2. (72*10*6/2)*2 = 72*10*6
	TIM2->PSC = 0;
	TIM2->ARR = 360;//200KHz(PERIOD)
	TIM2->CR1 |= TIM_CR1_ARPE ;
	TIM2->CCR1 = fill_max/2;//AMPLITUDA OUT CONVERTER
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	TIM2->CCER |= TIM_CCER_CC1E;
	TIM2->CCMR1 |= TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_1;
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	TIM2->DIER |= TIM_DIER_UIE;
	NVIC_SetPriority(TIM2_IRQn,0);
	NVIC_EnableIRQ(TIM2_IRQn);
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	TIM2->EGR |= TIM_EGR_UG; 
	TIM2->SR = 0;
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////*START TIMER 2.3.4.*/////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	TIM2->CR1 |= TIM_CR1_CEN;
//	TIM3->CR1 |= TIM_CR1_CEN;
//	TIM4->CR1 |= TIM_CR1_CEN;
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

//  SysTick->LOAD = 9000000/1000 -1;//1mS
//  SysTick->VAL = 0;                                                                 
//  SysTick->CTRL=SysTick_CTRL_CLKSOURCE_Pos | SysTick_CTRL_TICKINT_Msk | SysTick_CTRL_ENABLE_Msk;
  while(1) {}
}
void TIM2_IRQHandler (void)
{
	/* прерывание 200*10*3 раз в секунду. 200*10*3/ 1*10*3 = 200 
	1000 раз в секунду маняем значение амплитуды.
	чтобы менять амплитуду при 10*/
	if( TIM2->SR & TIM_SR_UIF ){
    TIM2->SR = ~TIM_SR_UIF;
    led_green_on;
    TIM2->CCR1 = sin_dac[++i];
    if(i==200){i=0;}
	}
}

генерация треугольника 1кГц.
в спектре 1кГц 2кГц 3кГц 5кГц с уменьшением громкости, наверно, в децибелах же ..., четкие такие пики. если кому интересно могу скрины выложить. точно как https://habrastorage.org/getpro/habr/po … b3a5e4.gif
только у меня симметрично. от 3,3 вольт до 12В от 12 до 3,3В, 1 кГц. делать синусоиду не вижу смысла.
как понимаю гармоники можно подавить фильтрами.
мне предстоит это все еще модулировать математически и выводить. можно и фильтры мат-и сделать. уж докучи чтоб совсем.  :jumping:  не буду не осилю...
https://habr.com/post/219337/

Код:
#define S_RATE  (44100) //частота дискретизации
#define BUF_SIZE (S_RATE*10) /* 2 second buffer */
….

int main(int argc, char * argv[])
{
...
	float amplitude = 32000; //берём максимальную возможную амплитуду
	float freq_Hz = 100; //частота сигнала
	/* fill buffer with a sine wave */
	for (i=0; i<BUF_SIZE; i++)
	{

    buffer[i] +=(int)(amplitude * sin((float)(2*M_PI*i*freq_Hz/S_RATE))); 
	}
	write_wav("test.wav", BUF_SIZE, buffer, S_RATE);
 
	return 0;
}

42

Код:
#include "stm32f10x.h"
//#include "usblib.h"
#include "define.h"
#include <math.h>
uint16_t i=0;
#define S_RATE  (75) //выборок в секунду. частота дискретизации
uint16_t buffer[S_RATE+1];
int main(void)
{
	for(i=0;i<=S_RATE;++i){
    buffer[i] = (uint16_t)(((fill_max-fill_min)/2)*(sinf(2*3.1415926536*i/S_RATE)+1) + fill_min); 
	}
	i=0;
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////AHB = 72MHz; APB1 = 36MHz; ARB2 = 72MHz////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  RCC->APB2ENR |= 
	RCC_APB2ENR_IOPAEN | /*PORTA CLK ON */
	RCC_APB2ENR_IOPBEN | /*PORTB CLK ON */
	RCC_APB2ENR_IOPCEN | /*PORTC CLK ON */
	RCC_APB2ENR_AFIOEN | /*Alternate functions CLK ON */
	RCC_APB2ENR_TIM1EN /*TIMER1 CLK ON */
	;
	RCC->APB1ENR |= 
	RCC_APB1ENR_TIM2EN | /*TIMER2 CLK ON */
	RCC_APB1ENR_TIM3EN | /*TIMER3 CLK ON */
	RCC_APB1ENR_TIM4EN   /*TIMER4 CLK ON */
	;
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//GPIO_CRL_MODEx > 0 : OUTPUT
//GPIO_CRL_MODEx01 : Maximum output speed 10 MHz
//GPIO_CRL_MODEx10 : Maximum output speed 2 MHz
//GPIO_CRL_MODEx11 : Maximum output speed 50 MHz
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//GPIO_CRL_CNFx_1 = 1 : Alternate Function output	PP
//GPIO_CRL_CNFx_1 = 0 : General purpose output
//GPIO_CRL_CNFx_0 = 1 : Open-drain
//GPIO_CRL_CNFx_0 = 0 : Push-pull
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//GPIO_CRL_MODEx = 0 : INPUT
//GPIO_CRL_CNFx_1 = 0 & GPIO_CRL_CNFx_0 = 0 : Analog INPUT	
//GPIO_CRL_CNFx_1 = 0 & GPIO_CRL_CNFx_0 = 1 : Input floating
//GPIO_CRL_CNFx_1 = 1 & GPIO_CRL_CNFx_0 = 0 & PxODR.PIN=0 : Input pull-down
//GPIO_CRL_CNFx_1 = 1 & GPIO_CRL_CNFx_0 = 0 & PxODR.PIN=1 : Input pull-up	
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/*PA.0*/                                                        	/*PA.0(PWM TIM2 CH1)*/
	GPIOA->CRL = (GPIOA->CRL & ~(GPIO_CRL_MODE0 | GPIO_CRL_CNF0)) | /*clear mode pin PA.0 to 0*/
	GPIO_CRL_MODE0_1 |                                             	/*Maximum output speed 2 MHz*/
	GPIO_CRL_CNF0_1                                                 /*Alternate Function output*/
	;
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/*PA.6*/                                                        	/*PA.6(PWM TIM3 CH1)*/	
	GPIOA->CRL = (GPIOA->CRL & ~(GPIO_CRL_MODE6 | GPIO_CRL_CNF6)) | /* clear mode pin PA.6 to 0*/
	GPIO_CRL_MODE6_1 |                                             	/*Maximum output speed 10 MHz*/
	GPIO_CRL_CNF6_1                                               	/*Alternate Function output*/
	;
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/*PC.8 LED(define.h)*/
//	led_blue_init;
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/*PC.9 LED(define.h)*/
	led_green_init;
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/*PC.10 LED(define.h)*/
//	led_red_init;
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////ПРИМЕР -- TIMER 4: CH4 - A.3(capture/PWM/OFF)///////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////    
////////////////////////TIMER 4: CH4 - B.9(OFF); CH3 - B.8(OFF); CH2 - B.7(OFF); CH1 - B.6(OFF);////////////////////////////
////////////////////////TIMER 3: CH4 - B.1(OFF); CH3 - B.0(OFF); CH2 - A.7(OFF); CH1 - A.6(OFF);////////////////////////////
////////////////////////TIMER 2: CH4 - A.3(OFF); CH3 - A.2(OFF); CH2 - A.1(OFF); CH1 - A.0(OFF);////////////////////////////
////////////////////////TIMER 1: CH4 - A.11(OFF); CH3 - A.10(OFF); CH2 - A.9(OFF); CH1 - A.8(OFF);//////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /* =========== TIM1 ========== */
//TIMER 1: CH4 - A.11(OFF); CH3 - A.10(OFF); CH2 - A.9(OFF); CH1 - A.8(OFF);

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////*TIMER2 INIT*///////////////////////////////////////////////////////////
///////////////////////////////////////*BOOSTER CONVERTER 3-4.2VOLT to 12VOLT*//////////////////////////////////////////////
/////////////////////*TIMER 2: CH4 - A.3(OFF); CH3 - A.2(OFF); CH2 - A.1(OFF); CH1 - A.0(PWM);*/////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//клок таймера 72МГц если делитель APB1 = 1 то множитель 1. иначе *2. (72*10*6/2)*2 = 72*10*6
	TIM2->PSC = 0;
	TIM2->ARR = 360;//200KHz(PERIOD)
	TIM2->CR1 |= TIM_CR1_ARPE ;
	TIM2->CCR1 = fill_max/2;//AMPLITUDA OUT CONVERTER
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	TIM2->CCER |= TIM_CCER_CC1E;
	TIM2->CCMR1 |= TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_1;
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	TIM2->DIER |= TIM_DIER_UIE;
	NVIC_SetPriority(TIM2_IRQn,0);
	NVIC_EnableIRQ(TIM2_IRQn);
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	TIM2->EGR |= TIM_EGR_UG; 
	TIM2->SR = 0;
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////*START TIMER 2.3.4.*/////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	TIM2->CR1 |= TIM_CR1_CEN;
//	TIM3->CR1 |= TIM_CR1_CEN;
//	TIM4->CR1 |= TIM_CR1_CEN;
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

//  SysTick->LOAD = 9000000/1000 -1;//1mS
//  SysTick->VAL = 0;                                                                 
//  SysTick->CTRL=SysTick_CTRL_CLKSOURCE_Pos | SysTick_CTRL_TICKINT_Msk | SysTick_CTRL_ENABLE_Msk;
  while(1) {}
}
void TIM2_IRQHandler (void)
{
	/*
	прерывание 200*10*3 раз в секунду.  
	5 мкС квант времени генерируемого синуса 
	75(выборок)*5мкС = период генерируемого синуса = 375мкС ~ 2666.666 Гц
	*/
	if( TIM2->SR & TIM_SR_UIF ){
    TIM2->SR = ~TIM_SR_UIF;
    TIM2->CCR1 = buffer[i++];
    if(i>S_RATE)
    {i=0;}
	}
}

генерация синуса 2,666 кГц. и спектр чист. Только 2,666кГц.
частота генерирования зависит от кол-ва выборок * на время выборки.

43

=((((SIN((2*PI()*A1)/75)+1))*(SIN((2*PI()*A1)/20000)))*(90/2))+10


Вы здесь » Микроконтроллеры » RA » Повышающий преобразователь. stm8s.