Синусоида с помощью STM32F100

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
Vozz
Родился
Сообщения: 3
Зарегистрирован: Ср июн 22, 2016 08:20:49

Синусоида с помощью STM32F100

Сообщение Vozz »

Здравствуйте, помогите новичку! До этого никогда не работал с МК, а тут начал с STM32F100 с наскоку.

Вот по одному из многочисленных уроков в инэте написал код и залил в МК.

#include "stm32f10x.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_tim.h"


void Init_Timer (void) {

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

GPIO_InitTypeDef Nozka;
Nozka.GPIO_Pin=GPIO_Pin_1;
Nozka.GPIO_Mode=GPIO_Mode_AF_PP;
Nozka.GPIO_Speed=GPIO_Speed_50MHz;

GPIO_Init(GPIOA,&Nozka);

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);

TIM_TimeBaseInitTypeDef TIM2_scr;

TIM2_scr.TIM_ClockDivision=TIM_CKD_DIV1;
TIM2_scr.TIM_CounterMode=TIM_CounterMode_Up;
TIM2_scr.TIM_Prescaler=24000-1;
TIM2_scr.TIM_Period=10000;



TIM_TimeBaseInit(TIM2,&TIM2_scr);

TIM_OCInitTypeDef TIM2_OC;

TIM2_OC.TIM_OCMode=TIM_OCMode_PWM1;
TIM2_OC.TIM_OCPolarity=TIM_OCPolarity_High;
TIM2_OC.TIM_Pulse=1000;
TIM2_OC.TIM_OutputState=TIM_OutputState_Enable;
TIM_OC2Init(TIM2,&TIM2_OC);

TIM_Cmd(TIM2,ENABLE);


}

int main (void)

{
Init_Timer();
while(1){};

}

Все работает на ура. Вот только решил пойти дальше, а именно получить положительную полуволну синуса и уткнулся лбом в стену.
В моем понимании задается некий массив со значениями синуса от 0 до 90 градусов, естественно пересчитанными в импульсы увеличивающейся длины. Все это загоняется на полевик IRL3705N.
В CCRx можно записать "0". Счетчик (CNT) массив кушает до 90 градусов синуса, затем значения в CNT и ARR становятся одинаковыми. Счетчик сбрасывается в "0". Как его заставить считать в обратном порядке этот же самый массив? И куда записывать массив? Напрямую в TIMx_CNT ? TIM_Pulse уже не имеет значения и его можно удалять? В TIMx_ARR пихать максимальное значение при синусе 90 градусов?
Пробовал такое сделать но не выходит.

Пока что учусь и прошу не судить меня строго за неправильную терминологию!
a5021
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Re: Синусоида с помощью STM32F100

Сообщение a5021 »

Не надо никого заставлять считать в обратном порядке. Счетчик считает и пусть себе считает. Значение синуса загоняется в регистр сравнения. С выхода шим-канала наблюдаем прямоугольный сигнал, в котором коэффициент заполнения соответствует значению синуса. Пропускаем этот сигнал через интегрирующую цепочку и получаем желанный синус.
Immortal_Buka
Родился
Сообщения: 9
Зарегистрирован: Ср май 06, 2015 14:21:38

Re: Синусоида с помощью STM32F100

Сообщение Immortal_Buka »

а чему DAC+DMA+TIM Не устраивает?
Vozz
Родился
Сообщения: 3
Зарегистрирован: Ср июн 22, 2016 08:20:49

Re: Синусоида с помощью STM32F100

Сообщение Vozz »

Immortal_Buka писал(а):а чему DAC+DMA+TIM Не устраивает?


Потому что мне нужно получить трехфазный синус. С помощью DAC я максимум две фазы смогу получить - и то потом все это загонять на полевик ... На практике я не пробовал таким заниматься, но пишут что полевик будет неплохо греться.
Аватара пользователя
Andrew Martin
Вымогатель припоя
Сообщения: 606
Зарегистрирован: Вт июн 25, 2013 18:45:07

Re: Синусоида с помощью STM32F100

Сообщение Andrew Martin »

Да вы, батенька, никак на частотник замахнулись? :)))
Сделайте массив синуса от 0 до 360 - не нужно будет ничего переключать.
Ответить

Вернуться в «ARM»