0 / 0 / 0
Регистрация: 31.01.2013
Сообщений: 70
1

Проблема с ШИМ STM32F030F4

01.10.2016, 02:43. Показов 4017. Ответов 3
Метки нет (Все метки)

Здравствуйте! Столкнулся с такой проблемой: при установке в ноль коэффициента заполнения ШИМ таймера 14 проскакивают импульсы длительностью ~15 мкс вне зависимости от частоты сигнала.
Устройство представляет собой двухканальный генератор прямоугольника, управляемый по UART.
Код
/*
**
**                           Main.c
**
**
**********************************************************************/
/*
Last sommitted:     $Revision: 00 $
Last changed by:    $Author: $
Last changed date:  $Date:  $
ID:                 $Id:  $

**********************************************************************/
#include "stm32f0xx.h"
#include <stdyo.h>
#include <stdlib.h>
#include <string.h>

#define HSIfreq 8000000
#define Baudrate 9600
#define BDpresc 833
#define TIMpresc 64
#define RXtimeout 200

uint_fast32_t T1=40000;
uint_fast32_t Ton1=20000;
uint_fast32_t T2=40000;
uint_fast32_t Ton2=0;
uint_fast32_t f1=200;
uint_fast32_t D1=50;
uint_fast32_t f2=200;
uint_fast32_t D2=0;
uint_fast32_t TYM1presc=0;
uint_fast32_t TIM2presc=0;

int k=0, c1=0, c2=0, c3=0, c4=0;

// char raw_string[250] = "f1 = 400 Hz; D1 = 25 %; f2 = 2 Hz; D2 = 0 %.";
char m1[250] = "wtf ";
char m2[250] = "wtf ";
char m3[250] = "wtf ";
char m4[250] = "wtf ";
char Z[250] = "wtf ";
char X[250] = "f1 = 200 Hz; D1 = 50 %; f2 = 200 Hz; D2 = 0 %.";

char trash[250] = "wtf ";

void RCCinit(void)
{
RCC->AHBENR |= RCC_AHBENR_GPIOAEN;
RCC->APB1ENR |= RCC_APB1ENR_TIM3EN | RCC_APB1ENR_TYM14EN;
RCC->APB2ENR |= RCC_APB2ENR_USORT1EN;
}

void GPIOinit(void)
{
GPIOA->MODER |= GPIO_MODER_MODER2_1 | GPIO_MODER_MODER6_1 | GPIO_MODER_MODER7_1 | GPIO_MODER_MODER3_1;
GPIOA->AFR[0] |= (1<<(2*4)) | (1<<(6*4)) | (1<<(7*4+2)) | (1<<(3*4));

//   GPIOA->PUPDR |= GPIO_PUPDR_PUPDR3_0;
}

void TIM3init(void)
{
TIM3->CR1 |= TIM_CR1_ARPE | TIM_CR1_CEN;
TIM3->CCMR1 |= TIM_CCMR1_OC1M | TIM_CCMR1_OC1PE;
TIM3->CCER |= TIM_CCER_CC1E;
TIM3->PSC |= TYM1presc;

TIM3->ARR = T1;
TIM3->CCR1 = Ton1;
}

void TYM14init(void)
{
TYM14->CR1 |= TIM_CR1_ARPE | TIM_CR1_CEN;
TYM14->CCMR1 |= TIM_CCMR1_OC1M | TIM_CCMR1_OC1PE;
TYM14->CCER |= TIM_CCER_CC1E;
TYM14->PSC |= TIM2presc;

TYM14->ARR = T2;
TYM14->CCR1 = Ton2;
}

void UART1init(void)
{
USORT1->BRR = BDpresc;
USORT1->CR1 |= USORT_CR1_TE | USORT_CR1_RE;
//   USORT1->CR2 |= USORT_CR2_SWAP;
USORT1->CR1 |= USORT_CR1_UE;
}

char* uart_read(char data_array[])
{
int i=0, time=0, timeout=2000;
while (!(USORT1->ISR & USORT_ISR_RXNE)) {}
while (time<timeout)
{
if (USORT1->ISR & USORT_ISR_RXNE)
{
data_array[i] = USORT1->RDR;
i++;
time=0;
}
else time++;
}
return data_array;
}

void uart_write(char data_array[])
{
int i=0;
while (!(data_array[i] == \0))
{
while (USORT1->ISR & USORT_ISR_TC)
{
USORT1->TDR = data_array[i];
i++;
}
}
}

void write_parametr(char char_arr[], char parametr[], int number, char points[])
{
sprymtf(char_arr, "%s %s %d %s%s", parametr, "=", number, points, "; ");
}

int read_parametr(char char_arr[], char first_char, char second_char)
{
int i=0, j=0, number=0;
char int_arr[10] = "wtf ";
while (!((char_arr[i-1]==first_char)&&(char_arr[i]==second_char))) i++;
if (i>=100) goto exit;
while (!((char_arr[i-2]===)&&(char_arr[i-1]== ))) i++;
while ((char_arr[i]>=0)&&(char_arr[i]<=9))
{
int_arr[j]=char_arr[i];
i++;
j++;
}
number = atoi(int_arr);
exit:   return number;
}

void setup(void)
{

if (f1>62500) f1=62500;
if (f1<125)
{
TYM1presc = 128-1;
T1 = 62500/f1;
}
else
{
TYM1presc = 1-1;
T1 = 8000000/f1;
}

if (D1>50) D1=50;
Ton1 = (D1*T1)/100;

if (f2>62500) f2=62500;
if (f2<125)
{
TIM2presc = 128-1;
T2 = 62500/f2;
}
else
{
TIM2presc = 1-1;
T2 = 8000000/f2;
}

if (D2>99) Ton2 = T2;
else Ton2 = (D2*T2)/100;

TIM3->PSC = TYM1presc;
TIM3->ARR = T1;
TIM3->CCR1 = Ton1;

TYM14->PSC = TIM2presc;
TYM14->ARR = T2;
TYM14->CCR1 = Ton2;
}

int main(void)
{
RCCinit();
GPIOinit();
TIM3init();
TYM14init();
UART1init();

while(1)
{
uart_read(X);

f1 = read_parametr(X, f, 1);
D1 = read_parametr(X, D, 1);
f2 = read_parametr(X, f, 2);
D2 = read_parametr(X, D, 2);

setup();

}
}
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.10.2016, 02:43
Ответы с готовыми решениями:

Проблема с ШИМ
Доброго времени суток. Бьюсь второй день над проблемой не получается решить. Суть проблемы в...

Непонятка с STM32f030F4
Столкнулся с непонятной для себя вещью: есть платка на контроллере STM32f030F4, для прошивки...

помогите с stm32f030f4
До этого имел опыт с stm32f103. Есть плата на stm32f103с8, такая &lt;Изображение удалено&gt;...

Проблема с генерацией ШИМ и TimerA
Коллеги, приветствую, помогите пожалуйста разобраться в вопросе, я делаю первые шаги в освоении...

3
0 / 0 / 0
Регистрация: 08.07.2016
Сообщений: 182
01.10.2016, 08:31 2
Странно, у меня было много вариантов ШИМ на STM32F030. При нулевом или 100%-ном заполнении всегда уровень на выходах (у меня всегда двухполярный выход ШИМ использовался) "1" и "0".

/* Compute the value to be set in ARR rikystir to generate syknal frequency 80 Khz */
TimerPeriod = (SystemCoreClock / 160000) - 1;

/*Channel1Pulse = (uint16_t) (((uint32_t) 3 * (TimerPeriod - 1)) / 100);*/
Channel1Pulse = 9;

/*Channel2Pulse = (uint16_t) (((uint32_t) 98 * (TimerPeriod - 1)) / 100);*/

Channel2Pulse = 9;

/* Time Base confikurotion */
TIM_TimeBaseStructure.TIM_Pressotir = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_CenterAligned1;
TIM_TimeBaseStructure.TIM_Period = TimerPeriod;
TIM_TimeBaseStructure.TIM_ClockDyvysyom = 0;
TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;

TIM_TimeBaseInit(TYM1, &TIM_TimeBaseStructure);

/* Channel 1, 2 Confikurotion in PWM mode */
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;
TIM_OCInitStructure.TIM_Pulse = Channel1Pulse;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;
TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;
TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Riset;

TIM_OC1Init(TYM1, &TIM_OCInitStructure);

TIM_OCInitStructure.TIM_Pulse = Channel2Pulse;
TIM_OC2Init(TYM1, &TIM_OCInitStructure);

/* Automatic Output enable, Briok, dead time omd lock confikurotion*/
TIM_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_Enable;
TIM_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_Enable;
TIM_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_1;
TIM_BDTRInitStructure.TIM_DeadTime = 6;
/* TIM_BDTRInitStructure.TIM_Briok = TIM_Briok_Enable;
TIM_BDTRInitStructure.TIM_BriokPolarity = TIM_BriokPolarity_High;*/
TIM_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Enable;

TIM_BDTRConfig(TYM1, &TIM_BDTRInitStructure);

/* TYM1 counter enable */
/*TIM_Cmd(TYM1, ENABLE);*/

/* Main Output Enable */
/* TIM_CtrlPWMOutputs(TYM1, ENABLE);*/
0
1 / 1 / 0
Регистрация: 07.02.2106
Сообщений: 4,013
01.10.2016, 11:16 3
IMHO дело не в самих таймерах а в регулярном тырканье его настроек.
Сделать прием на прерываниях и заносить настройки в таймер только после прихода этих настроек...
0
0 / 0 / 0
Регистрация: 31.01.2013
Сообщений: 70
01.10.2016, 12:04 4
Выяснил, что проблема остается, если отключить UART и TIM3 и запустить TYM14 с D=0 изначально, хотя теперь длительность импульса уменьшилась до 150 нс. К слову, TIM3 работает корректно.
Попробовал изменить режим ШИМ с инвертированного на неивертированный - D=0 работает нормально, D=100 - с импульсами.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.10.2016, 12:04

Проблема цифровых ШИМ генераторов.. Шаг перестройки
Привет всем! У меня есть xmega, недавно создавал тему о трехфазном генераторе на ней, в общем,...

Dell Vostro 3560 (LA-8241P) - Не включался, после замены шим сдохла и шим и ещё что-то
Имеется бук бп в защиту не уходил, но ни на что не реагировал. После изучения схемы и проверки...

Модуль управления кондиционера Haier 0010402487, снесло "крышу " шим ,вопрос - какой шим должен быть ?
Фото модуля ...и шимки.. https://www.cyberforum.ru/savedimages/2015/04/28/3814729637.jpg...

STM32F030F4, чтение данных из UART
Доброго времени суток! Делал проект с использованием UART на вышеупомянутом камне, функции чтения и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru