Skocz do zawartości
Zaloguj się, aby obserwować  
dejmieno

STM32 pomoc w dostrojeniu timera do diod WS2812.

Pomocna odpowiedź

Witam,

Usiłuję odpalić pasek programowalnych diod led, używając kontroller STM32F1.

W programie wykorzystuję PWM i DMA do wysyłania bitów do kontrolera taśmy. Małymi kroczkami idę do przodu ciągle rozwiązując jakiś problem. Mój aktualny efekt pracy można zobaczyć na obrazku w załączniku. Jak widać wszystkie ledy świecą tak jak chciałem. Tylko niestety kolory się nie zgadzają. Według danych które wysyłam wszystkie powinny być zielone. Tylko pierwsza dioda świeci jak należy. Bardzo proszę o pomoc w dostrojeniu timera. Naprowadzenie gdzie może być problem. Poniżej kod programu.

Moduł timera:

#include "timers/tim4.h"
#include "stm32f10x.h"

void Init_TIM4()
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);

GPIO_InitTypeDef gpio;
GPIO_StructInit(&gpio);

gpio.GPIO_Mode = GPIO_Mode_AF_PP;
gpio.GPIO_Pin = GPIO_Pin_8;
gpio.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &gpio);

TIM_TimeBaseInitTypeDef tim;
TIM_TimeBaseStructInit(&tim);
tim.TIM_CounterMode = TIM_CounterMode_Up;
tim.TIM_Period = 64 - 1;
TIM_TimeBaseInit(TIM4, &tim);

TIM_OCInitTypeDef channel;
TIM_OCStructInit(&channel);
channel.TIM_OCMode = TIM_OCMode_PWM1;
channel.TIM_OutputState = TIM_OutputState_Enable;
channel.TIM_Pulse = 0;
channel.TIM_OCIdleState = TIM_OCIdleState_Reset;
TIM_OC3Init(TIM4, &channel);
}

DMA i reszta programu:

#include "stm32f10x.h"
#include "timers/tim4.h"

#define BUFFER_SIZE 24

volatile uint16_t src_buffer[BUFFER_SIZE] = {52, 52, 52, 52, 52, 52, 52, 52, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22};

void send_data()
{
DMA_SetCurrDataCounter(DMA1_Channel1, BUFFER_SIZE);
DMA_Cmd(DMA1_Channel1, ENABLE);
TIM_Cmd(TIM4, ENABLE);

while(!DMA_GetFlagStatus(DMA1_FLAG_TC1));
TIM_Cmd(TIM4, DISABLE);
DMA_Cmd(DMA1_Channel1, DISABLE);
DMA_ClearFlag(DMA1_FLAG_TC1);
}

int main(void)
{
Init_TIM4();

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);

DMA_InitTypeDef dma;

DMA_StructInit(&dma);
dma.DMA_PeripheralBaseAddr = (uint32_t)&TIM4->CCR3;
dma.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
dma.DMA_MemoryBaseAddr = (uint32_t)src_buffer;
dma.DMA_MemoryInc = DMA_MemoryInc_Enable;
dma.DMA_BufferSize = BUFFER_SIZE;
dma.DMA_M2M = DMA_M2M_Disable;
dma.DMA_DIR = DMA_DIR_PeripheralDST;
dma.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
dma.DMA_Mode = DMA_Mode_Normal;
dma.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;

DMA_Init(DMA1_Channel1, &dma);
TIM_DMACmd(TIM4, TIM_DMA_CC1, ENABLE);

for (int i = 0; i < 8; i++) {
	send_data();
}

while (1)
{

}
}

led.thumb.jpg.2190431d42cdba049e13e9ded82a7fac.jpg

Udostępnij ten post


Link to post
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Gość
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

Zaloguj się, aby obserwować  

×
×
  • Utwórz nowe...