Skocz do zawartości

rizone1234

Użytkownicy
  • Zawartość

    12
  • Rejestracja

  • Ostatnio

Reputacja

1 Neutralna

O rizone1234

  • Ranga
    2/10

Ostatnio na profilu byli

Blok z ostatnio odwiedzającymi jest wyłączony i nie jest wyświetlany innym użytkownikom.

  1. Koniec problemu!!! Wystarczylo w kompilatorze usunąć zakomentowany kod i serwa działają poprawnie. Dzieki za pomoc
  2. Uciąłem końcówkę od zasilacza i podłączyłem go do przycisku. Potem od przycisku kabelki przylutowałem do goldpinów, a do goldpinów podpinam zwyklymi kabelkami od mikrokontrolerow wspomniane serwa. Sprawdziłem za pomocą lampki czy STM32 sie resetuje, nie resetuje się. A sygnał z zasilacza sprawdzałem na oscyloskopie, pojawiła sie pozioma linia na zakresie 6,5 V. No do niczego sie nie moza przyczepić. Nie wiem czemu te serwa wracają za każdym razem.
  3. Teraz jeszcze raz odpalilem te serwa i tak, mija około 1 sekunda zanim serwo wraca do poprzedniej pozycji
  4. Dzięki za zainteresowanie tematem. Serwa po zadanej pozycji od razu wracają do poprzedniej. Używam najzwyklejszego zasilacza DC o parametrach 6,5 V i 3,2 A. Już podaje kod, jako mikrokontrolera używam STM32 F407G-DISC1. PROGRAM GŁÓWNY: #include "stm32f4xx.h" #include <stdio.h> #include "PWM.h" #include "PWM1.h" volatile uint16_t valuee; volatile uint16_t valueee; volatile uint32_t msTicks; void SysTick_Handler(void){ msTicks++; } static void Delay(__IO uint32_t dlyTicks){ uint32_t curTicks = msTicks; while((msTicks - curTicks)<dlyTicks); } void setSysTick(void){ if(SysTick_Config(SystemCoreClock/1000)){ while(1){}; } } int main(void) { SystemInit(); setSysTick(); PWM1(2000); while(1){ } } FUNKCJA PLIK .c #include "PWM1.h" void PWM1(int value){ GPIO_InitTypeDef GPIO_InitStruct; TIM_TimeBaseInitTypeDef TIM_BaseStruct; TIM_OCInitTypeDef outputChannelInit; TIM_OCStructInit (&outputChannelInit); RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); GPIO_PinAFConfig(GPIOB, GPIO_PinSource11, GPIO_AF_TIM2); GPIO_InitStruct.GPIO_Pin = GPIO_Pin_11; GPIO_InitStruct.GPIO_OType = GPIO_OType_PP; GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_100MHz; GPIO_Init(GPIOB, &GPIO_InitStruct); TIM_BaseStruct.TIM_Prescaler = 83; TIM_BaseStruct.TIM_CounterMode = TIM_CounterMode_Up; TIM_BaseStruct.TIM_Period = 19999; TIM_BaseStruct.TIM_ClockDivision = 0 ; TIM_BaseStruct.TIM_RepetitionCounter = 0; TIM_TimeBaseInit(TIM2, &TIM_BaseStruct); TIM_Cmd(TIM2, ENABLE); outputChannelInit.TIM_OCMode = TIM_OCMode_PWM1; outputChannelInit.TIM_OutputState = TIM_OutputState_Enable; outputChannelInit.TIM_OCPolarity = TIM_OCPolarity_High; outputChannelInit.TIM_Pulse = value; TIM_OC4Init(TIM2, &outputChannelInit); TIM_OC4PreloadConfig(TIM2, TIM_OCPreload_Enable); } FUNKCJA PLIK .h #ifndef __PWM1__ #define __PWM1__ #include <stdint.h> #include "stm32f4xx_gpio.h" #include "stm32f4xx_tim.h" extern void PWM1(int value); #endif // __PWM1__ Tylko jak wspomniałem z poprzednimi serwami nie było problemu, jak używałem tego programu. Tylko ze tamte serwa to: TOWER PRO MG 996 R z dopiskiem 180 stopni robotic, a te to z którymi mam problem to: TOWER PRO MG 996 R z dopiskiem digi hi torque. W ogóle te nowe serwa nie chciały na początku działac dopiero później zaczeły działac, tak jak opisałem po zadanej pozycji PWM wracają do poprzedniej pozycji. Może klucz do poprawnego działania tych serw jest sterownik jaki posiadają.
  5. Witam, mam problem z serwem które po zadaniu pozycji z PWM, wraca za każdym razem do poprzedniej pozycji. Nie wiem o co chodzi z innymi serwami tak nie miałem. Teraz nie dawno kupiłem nowe dwa serwa i z obiema mam problem by nimi sterować. Nie wiem, może to są jakieś inne rodzaje serw, nie mam pojęcie co jest nie tak, bo pierwszy raz mam taki problem. Prosze o pomoc Pozdrawiam rizone1234
  6. Witam, nie mogę zmierzyć prądu za pomocą układu ACS712, przy użyciu STM32. Pomiar, w ogóle się nie wykonuje. Zamieszczam kod poniżej i bardzo proszę o pomoc. #include "stm32f4xx.h" #include <stdio.h> #include "chwytak.h" volatile uint16_t valuee; int WartoscPrzetwo = 0; // wartosc odczytana z ADC ADC_CommonInitTypeDef ADC_CommonInitStructure; void KonfiguracjaADC(void); int KonwersjaADC(void); volatile uint32_t msTicks; //counts 1ms timeTicks void SysTick_Handler(void) { msTicks++; } // Delays number of Systicks (happens every 1 ms) static void Delay(__IO uint32_t dlyTicks){ uint32_t curTicks = msTicks; while ((msTicks - curTicks) < dlyTicks); } void setSysTick(void){ // ---------- SysTick timer (1ms) -------- // if (SysTick_Config(SystemCoreClock / 1000)) { // Capture error while (1){}; } } int main(void) { //Rozpoczecie konfiguracji KonfiguracjaADC(); SystemInit(); setSysTick(); while(1) { WartoscPrzetwo = KonwersjaADC(); chwytak(2500); WartoscPrzetwo = KonwersjaADC(); Delay(1500); chwytak(1650); WartoscPrzetwo = KonwersjaADC(); Delay(1500); } } void KonfiguracjaADC() { ADC_InitTypeDef ADC_Init_Structure; GPIO_InitTypeDef GPIO_Init_Structure; //Konfiguracja zegarów //ADC1 podlaczone do APB2 RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); //Zegar dla portu ADC RCC_AHB1PeriphClockCmd(RCC_AHB1ENR_GPIOCEN, ENABLE); //Konfiguracja pinu analogowego //Kanal 10 podlaczony do PC0 GPIO_Init_Structure.GPIO_Pin = GPIO_Pin_0; GPIO_Init_Structure.GPIO_Mode = GPIO_Mode_AN; GPIO_Init_Structure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOC, &GPIO_Init_Structure); ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent; ADC_CommonInit(&ADC_CommonInitStructure); //Konfiguracja ADC ADC_DeInit(); //Przetworzone dane wyrównane do prawej ADC_Init_Structure.ADC_DataAlign = ADC_DataAlign_Right; //Dane wejsciowe przetwarzane w 12 bitowy numer z duza dokladnoscia, max 4096 ADC_Init_Structure.ADC_Resolution = ADC_Resolution_12b; //Konwersacja jest ciagla przetwarzanie wiecej niz jeden raz ADC_Init_Structure.ADC_ContinuousConvMode = ENABLE; ADC_Init_Structure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1; //Bez wyzwalania zewnetrznego ADC_Init_Structure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None; //Liczba konwersji ADC_Init_Structure.ADC_NbrOfConversion = 1; //Pomiar jednego kanalu, skanowanie kanalow zostalo wylaczone ADC_Init_Structure.ADC_ScanConvMode = DISABLE; //Inicjalizacja ADC ADC_Init(ADC1, &ADC_Init_Structure); //Wybranie kanalu z którego bedzie odczytywane //ADC kanal 10, GPIOC1, Czestotliwosc probkowania = 1Mhz ADC_RegularChannelConfig(ADC1,ADC_Channel_10,1,ADC_SampleTime_144Cycles); //Wlaczenie konwersji ADC ADC_Cmd(ADC1,ENABLE); } int KonwersjaADC() { //Rozpoczecie konwersji ADC_SoftwareStartConv(ADC1); //Przetwarzanie while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC)); //Zwrócenie przetworzonych danych return ADC_GetConversionValue(ADC1); } Do odczytania wartości prądu używam przetwornika ADC.
  7. /* USER CODE BEGIN PV */ /* Private variables ---------------------------------------------------------*/ uint8_t Received[10]; /* USER CODE END PV */ /* USER CODE BEGIN PFP */ /* Private function prototypes -----------------------------------------------*/ void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { uint8_t Data[40]; // Tablica przechowujaca wysylana wiadomosc. uint16_t size = 0; // Rozmiar wysylanej wiadomosci size = sprintf(Data, "Odebrana wiadomosc: %s\n\r",Received); HAL_UART_Transmit_IT(&huart1, Data, size); // Rozpoczecie nadawania danych z wykorzystaniem przerwan HAL_UART_Receive_IT(&huart1, Received, 10); // Ponowne włączenie nasłuchiwania HAL_GPIO_TogglePin(LED_BLUE_GPIO_Port, LED_BLUE_Pin); } /* USER CODE END PFP */ /* USER CODE BEGIN 2 */ HAL_UART_Receive_IT(&huart1, Received, 10); /* USER CODE END 2 */ Kod jest taki jak w kursie o stm32 f4. Ja chciałbym, żeby mi każde słowo się wyświetlało w Real Term, nie tylko o długości 10 znaków, ale także po 8 znaków czy 6 znaków. Reasumując, chciałbym o dowolnej ilości znaków słowo wysłane przez UART, zobaczyć w terminalu. Piszę słowo "pies" chciałbym zobaczyć to słowo, później napisze np. "dzwoneczek" też chciałbym aby to słowo się pojawiło w terminalu.
  8. Mam, pytanie jak stworzyć program który będzie przesyłał dowolną, różną ilość znaków, czyli żeby w terminalu pokazywały się słowa o różnej długości a nie np o stałej wartości 10 znaków?
  9. Przepraszam, że nie odpowiadałem, ale nie miałem czasu. Wszystko gra, przerzucam się teraz na discovery. Cały cza zgłębiam język C oraz stm32.
  10. OK. Postaram się poprawić. Właśnie o to mi chodzi, żeby dane były wysyłane cięgiem po wciśnięciu ENTER. Próbowałem dane wysłać za pomocą Broadcast Command, ale nie wyszło. Jak mógłbyś mi pomóc jak to trzeba poustawiać w Teraterm.
  11. Dziękuję za odpowiedź, ale w kodzie atMegaTona wyrzuca mi błąd w dwóch linijkach i niestety nie działa:( Chodzi o te dwie linijki: while(!UART_RX_RDY); bufor[c] = UART_REG; Nie wiem czemu nie działa, gdyby można było napisać co nie jest tak... Cały kod programu wrzucam tutaj: #include "stm32f10x.h" #define MCP_IODIR 0x00 #define MCP_IPOL 0x01 #define MCP_GPINTEN 0x02 #define MCP_DEFVAL 0x03 #define MCP_INTCON 0x04 #define MCP_IOCON 0x05 #define MCP_GPPU 0x06 #define MCP_INTF 0x07 #define MCP_INTCAP 0x08 #define MCP_GPIO 0x09 #define MCP_OLAT 0x0a void send_char(char c) { while (USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET); USART_SendData(USART2, c); } int __io_putchar(int c) { if (c=='\n') send_char('\r'); send_char(c); return c; } uint8_t spi_sendrecv(uint8_t byte) { // poczekaj az bufor nadawczy bedzie wolny while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET); SPI_I2S_SendData(SPI1, byte); // poczekaj na dane w buforze odbiorczym while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET); return SPI_I2S_ReceiveData(SPI1); } void mcp_write_reg(uint8_t addr, uint8_t value) { GPIO_ResetBits(GPIOC, GPIO_Pin_0); spi_sendrecv(0x40); spi_sendrecv(addr); spi_sendrecv(value); GPIO_SetBits(GPIOC, GPIO_Pin_0); } int main(void) { volatile int dly; GPIO_InitTypeDef gpio; SPI_InitTypeDef spi; USART_InitTypeDef uart; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE); GPIO_StructInit(&gpio); gpio.GPIO_Pin = GPIO_Pin_5|GPIO_Pin_7; // SCK, MOSI gpio.GPIO_Mode = GPIO_Mode_AF_PP; gpio.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &gpio); gpio.GPIO_Pin = GPIO_Pin_6; // MISO gpio.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, &gpio); gpio.GPIO_Pin = GPIO_Pin_0; // CS gpio.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOC, &gpio); GPIO_SetBits(GPIOC, GPIO_Pin_0); GPIO_StructInit(&gpio); gpio.GPIO_Pin = GPIO_Pin_2; gpio.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(GPIOA, &gpio); gpio.GPIO_Pin = GPIO_Pin_3; gpio.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, &gpio); USART_StructInit(&uart); uart.USART_BaudRate = 115200; USART_Init(USART2, &uart); USART_Cmd(USART2, ENABLE); SPI_StructInit(&spi); spi.SPI_Mode = SPI_Mode_Master; spi.SPI_NSS = SPI_NSS_Soft; spi.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_16; SPI_Init(SPI1, &spi); SPI_Cmd(SPI1, ENABLE); mcp_write_reg(MCP_IODIR, ~0x0f); char bufor[8]; while(1){ for(int c = 0; c<8; c++){ if(!bufor[c]) break; // jeśli NULL czyli koniec stringa wyjdź z pętli for } if(!(strcmp((const char*)bufor, "onlampy"))){ // porównaj ze sysłą predefiniowaną mcp_write_reg(MCP_OLAT, 0x0f); }else if(!(strcmp((const char*)bufor, "oflampy"))){ mcp_write_reg(MCP_OLAT, 0x00); }else{ printf("Bledny komunikat\n"); } } } Jako terminala uzywam TERATERM
  12. Witam, Mam problem z tym by wpisać całe słowo do terminala, Wciskam jedną literkę i juz terminal reaguje, nie czeka aż wpisze drugą czy trzecią literkę. Proszę poradźcie mi jak wpisać całe słowo np onlampy, aby załączyć diody. Nie chce by sie uruchamiały po jednej wklepanej literce. Problem jest z uartem na stm32. Korzystam z USART2.
×
×
  • Utwórz nowe...