Skocz do zawartości

Emerid

Użytkownicy
  • Zawartość

    18
  • Rejestracja

  • Ostatnio

Reputacja

3 Neutralna

O Emerid

  • Ranga
    2/10

Ostatnio na profilu byli

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

  1. Mógłby mi ktoś jeszcze wytłumaczyć różnicę między GPIO a OLAT?
  2. Moje przemyślenia, którymi podzielę się dla potomnych początkujących: A1, A2 - bity adresu MCP ustawiane napięciowo przy układzie scalonym (w naszym przypadku wiszą w powietrzu, czyli bardziej 0 niż 1, czyli adres : 00) SPI Control byte (device Opcode), czyli nawiązanie komunikacji z urządzeniem to: 0100 0(A1)(A2)(R/W) - W bicie kontrolnym na dwóch bitach ustawiamy adres A1,A2 urządzenia / R=1 w przypadku odczytu z MCP, W=0 w przypadku wysyłania informacji do MCP) Chcąc skomunikować się z MCP wysyłam (Control bit - adres urządzenia oraz kierunek transmisji , adres rejestru, wartość), gdzie adresy rejestrów i bity odpowiadające za poszczególne funkcje opisane są w tabeli poniżej Chcąc zaprogramować piny jako wyjście musimy ustawić odpowiadające bity w IODIR na 0 - 1111 1110 = ~0x01 - MCP_PIN_0_OUTPUT - 1111 1011 = ~0x04 - MCP_PIN_2_OUTPUT - 1101 1011 = ~0x24 - MCP_PIN_5_OUTPUT | MCP_PIN_2_OUTPUT - 0101 1011 = ~0xa4 - MCP_PIN_7_SET | MCP_PIN_5_OUTPUT | MCP_PIN_2_OUTPUT Wyjście pinów MCP ustawiać możemy poprzez wartości wysyłane do rejestru OLAT - 0000 0001 = 0x01 - MCP_PIN_0_SET - 0000 0100 = 0x04 - MCP_PIN_2_SET - 0010 0100 = 0x24 - MCP_PIN_5_SET | MCP_PIN_2_SET - 1010 0100 = 0xa4 - MCP_PIN_7_SET | MCP_PIN_5_SET | MCP_PIN_2_SET
  3. @Gieneq Na stronach 28-33 faktycznie jest opis pinów, ale nie widzę informacji, jak powiązać to z rozmieszczeniem na płytce Nucleo. Chodzi mi o coś podobnego do poniższego rysunku, ale z oficjalnych dokumentów.
  4. W którym pliku mogę znaleźć rozpiskę pinów przypisanych do danych modułów (SPI1, ADC1, GPIOA, itp.)? Do tej pory korzystałem z obrazka znalezionego na internecie, ale jednak chciałbym jakieś bardziej wiarygodnie źródło.
  5. Pytania do zadania 8.1. 1. Jest jakaś gotowa funkcja w C do porównywania tablic? 2. Da się to zrobić szybciej niż porównywanie kolejnych pozycji? (patrz kod) char compare_buffer( uint8_t a[], uint8_t b[], int size) { int i; for (i=0; i<size; i++) { if( a[i] != b[i] ) return 0; } return 1; }
  6. TIM_OC_InitTypeDef oc; oc.OCMode = TIM_OCMODE_PWM2; oc.Pulse = 100; oc.OCPolarity = TIM_OCPOLARITY_HIGH; oc.OCNPolarity = TIM_OCNPOLARITY_LOW; oc.OCFastMode = TIM_OCFAST_ENABLE; oc.OCIdleState = TIM_OCIDLESTATE_SET; oc.OCNIdleState = TIM_OCNIDLESTATE_RESET; HAL_TIM_PWM_ConfigChannel(&tim4, &oc, TIM_CHANNEL_1); HAL_TIM_PWM_ConfigChannel(&tim4, &oc, TIM_CHANNEL_2); HAL_TIM_PWM_ConfigChannel(&tim4, &oc, TIM_CHANNEL_3); -------------------------------------------------------- __HAL_TIM_SET_COMPARE(&tim4, TIM_CHANNEL_1, calc_pwm(b)); __HAL_TIM_SET_COMPARE(&tim4, TIM_CHANNEL_2, calc_pwm(g)); __HAL_TIM_SET_COMPARE(&tim4, TIM_CHANNEL_3, calc_pwm(r)); oc.Pulse = 100; ustawia wartość rejestru output_compare na 100 przy jego pierwotnej konfiguracji __HAL_TIM_SET_COMPARE(tim, channel, compare) jest makrem nadpisującym tylko wartość tego jednego rejestru output_compare, pozostawiając resztę konfiguracji output_compare nienaruszoną. Proszę o potwierdzenie, czy dobrze rozumiem działanie tego kodu.
  7. Mam pytanie do zadania 7.4. Co autor miał na myśli? Czy to co zapisałem poniżej jest celem, czy może coś jeszcze innego? 1000 -> 0100 -> 0010 -> 0001 -> 1000 -> ... (1 - dioda zapalona, 0 - dioda zgaszona) Jeśli zadanie jest jak powyżej, to mam w głowie jak to zrobić przy pomocy przerwań. Jeśli okres będzie T=1s, to przy 4 przerwaniach 4*7.7us / 1 s = 0.00308 % okresu, więc całkiem ok. Jeśli miałbym zrobić powyższe zadanie przy pomocy PWM, to niestety nie potrafię sobie tego wyobrazić. PWM ma swoje wypełnienie mierzone od punktu 0, do określonego punktu (PWM1), lub alternatywnie od odkreślonego punktu do końca okresu (PWM2). Może jakaś funkcja pulse byłaby ok, ale w kursie jeszcze nie było nic takiego omawiane.
  8. Moje środowisko nie rozpoznaje stałej ADC_SAMPLETIME_1CYCLES_5, ale chyba podziałało podstawienie wartości 000 zgodnie ze stroną 244 w reference manual - reszta (np. ADC_SAMPLETIME_239CYCLES_5) jest ok. Jeśli mam być szczery to nie zauważyłem żadnej znaczącej różnicy w dokładności pomiarów.
  9. Dla wartości R1 = 10k, R2 = 1k, C3 = 1000u układ działa poprawnie. Problem zaczyna się, kiedy dam R1 = 100R - poniżej zachowanie układu. 1. Kondensator ładuje się normalnie od wartości 0V do 4V (Stan Q = 1, świeci się dioda czerwona) 2. Kondensator rozładowuje się od 4V do 2.08V i zatrzymuje się (Stan Q = 0, świeci się dioda zielona) Trochę pomierzyłem i okazuje się, iż przy zastosowaniu rezystora R1 = 100R napięcie na pinie 7 (discharge) w momencie zwarcia tranzystora rozładowującego nie jest równe 0V (GND), tylko 2.08V. Jakiś pomysł dlaczego tak się dzieje? Edit: Kolejne pomiary V_cc = 5.76V Dla R1 = 50R (2x 100R połączone równolegle) V_DIS = 3.84V, (V_cc - V_DIS)/R1 = 38.4 mA Dla R1 = 76R (100R i 330R połączone równolegle) V_DIS = 2.80V, (V_cc - V_DIS)/R1 = 38.9 mA Myślicie, że 38mA to maksymalna wydolność tego tranzystora rozładowującego? Jak to wygląda z zatykaniem się tranzystorów? (Czy zatkanie oznacza jeszcze coś innego?) Edit2: Kolejne pomiary Zwiększenie V_cc rozwiązuje problem. Czy to oznacza, iż tranzystor rozładowujący ma małe wzmocnienie prądowe/ transkonduktancję?
  10. Jeśli dobrze rozumiem, w momencie kiedy odbierany jest sygnał, na pinie OUT występuje logiczne zero, czyli masa (GND), zatem dioda nie powinna świecić, bo nie ma zasilania. Czy nie jest odwrotnie? Dioda świeci właśnie w momencie odebrania sygnału. Mógłbym prosić o sprawdzenie, ewentualne wyjaśnienie mi czego nie rozumiem? Edit: Ok, już rozumiem, ale zostawię post. Przy generowanym stanie niskim tworzy się różnica potencjałów, która właśnie pozwala na przepływ prądu. (Dioda jest zasilana z baterii, a nie z układu scalonego i potrzebuje jedynie masy do zamknięcia obwodu)
  11. @Gieneq Dziękuję. Nie wiedziałem nawet, iż istnieje taka funkcja single. Trigger też poprawiłem Widzę piękne drgania Dla ciekawych, czas opadania zbocza 160ns, zatem minimalne pasmo przewodzenia= 0.34/160ns = 2.125 MHz lub dla dokładniejszych pomiarów (kolejne harmoniczne) 3*2.125 MHz = 6.375 MHz. Proszę jeszcze o potwierdzenie czy dobrze rozumiem. Pasmo przewodzenia jest po to, żeby sygnał nie był tłumiony, natomiast próbkowanie zbiera próbki sygnału bez względu na to, czy sygnał został stłumiony, czy nie. Tak to działa?
  12. #include "stm32f1xx.h" void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5); } int main(void){ SystemCoreClock = 8000000; HAL_Init(); __HAL_RCC_GPIOA_CLK_ENABLE(); __HAL_RCC_GPIOC_CLK_ENABLE(); GPIO_InitTypeDef gpio; gpio.Pin = GPIO_PIN_5; gpio.Mode = GPIO_MODE_OUTPUT_PP; gpio.Pull = GPIO_NOPULL; gpio.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOA, &gpio); gpio.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3; gpio.Mode = GPIO_MODE_OUTPUT_PP; gpio.Pull = GPIO_NOPULL; gpio.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOC, &gpio); gpio.Pin = GPIO_PIN_13; gpio.Mode = GPIO_MODE_IT_RISING; gpio.Pull = GPIO_PULLUP; HAL_GPIO_Init(GPIOC, &gpio); HAL_NVIC_EnableIRQ(EXTI15_10_IRQn); uint32_t led = 0; while(1){ if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_5) == GPIO_PIN_RESET){ HAL_GPIO_WritePin(GPIOC, 1 << led, GPIO_PIN_SET); HAL_Delay(150); HAL_GPIO_WritePin(GPIOC, 1 << led, GPIO_PIN_RESET); if(++led >= 4) led = 0; } else{ HAL_GPIO_WritePin(GPIOC, 8 >> led, GPIO_PIN_SET); HAL_Delay(150); HAL_GPIO_WritePin(GPIOC, 8 >> led, GPIO_PIN_RESET); if(++led >= 4) led = 0; } } } Moje rozwiązanie zadanie 4.1. Stan diody PA5 zmieniany jest poprzez interwencję. Czy da się w jakiś sposób utworzyć zmienną w funkcji HAL_GPIO_EXTI_Callback() i przesłać ją do funkcji main()?
  13. @Gieneq Jeśli chodzi o rezystancję switcha, to po prostu podłączyłem szeregowo rezystor i switch i obserwując napięcie na oscyloskopie ... aaa, no to jasne. Oscyloskop ma chyba impedancję 1M, więc to on by tworzył dzielnik z moim rezystorem, a nie switch. Racja? W jaki sposób przelicza się 500MS/s na 5mln próbek/s? Czy MS/s nie znaczy Million Samples / sekundę? Pomyślałem też, że winą może być niewystarczające pasmo przewodzenia układu. Mój tani oscyloskop z pasmem 50MHz z jeszcze tańszą sondą 60MHz dają pasmo systemu około 38MHz (obliczenia na podstawie kursu https://learn.keysight.com/oscilloscope-probes-201). Bylibyście w stanie zmierzyć dla mnie t_rise zboczy tych drgań? Pozdrawiam.
  14. Co zrobić, jeśli kompilator faktycznie pomija wiersze z delay? (U mnie działo się tak już w zalecanym System Workbench)
  15. Mój oscyloskop ma próbkowanie 500 MS/s - czy to dla tego nie jestem w stanie zaobserwować drgań na styka tact switcha? (za wolne próbkowanie?) Odnośnie podciągania i ściągania napięcia tact-switchem, to warto też nadmienić, żeby ten rezystor pierwotny nie miał zbyt dużej wartości, bo ja dla testu dałem 1M, co jest równe rezystancji tact-switcha przy rozwarciu i dostałem dzielnik napięcia
×
×
  • Utwórz nowe...