Проблема с ШИМ STM32F030F4 - ARM, Cortex, STM32 - Ответ 11357735
01.10.2016, 02:43. Показов 4253. Ответов 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();
}
}
Вернуться к обсуждению: Проблема с ШИМ STM32F030F4 ARM, Cortex, STM32
0
|