Skocz do zawartości

Tded

Użytkownicy
  • Zawartość

    36
  • Rejestracja

  • Ostatnio

Reputacja

0 Neutralna

O Tded

  • Ranga
    3/10
  • Urodziny 04.05.1995

Informacje

  • Płeć
    Mężczyzna
  • Lokalizacja
    Rytel
  • Zainteresowania
    IT, robotyka, mechatronika
  • Zawód
    Technik Informatyk, student Mechatroniki
  • www

Ostatnio na profilu byli

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

  1. Mam problem z obsługą przerwania wypełnienia bufora, na debugu widzę, że w ogóle nie wykonuje jego obsługi, o co tu chodzi? void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* adc_dma){ HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13); } Deklaracja dma: __HAL_RCC_DMA1_CLK_ENABLE(); __HAL_RCC_ADC1_CLK_ENABLE(); RCC_PeriphCLKInitTypeDef adc_clk; adc_clk.PeriphClockSelection = RCC_PERIPHCLK_ADC; adc_clk.AdcClockSelection = RCC_ADCPCLK2_DIV4; HAL_RCCEx_PeriphCLKConfig(&adc_clk); adc_dma.Instance = ADC1; adc_dma.Init.ContinuousConvMode = ENABLE; adc_dma.Init.ExternalTrigConv = ADC_SOFTWARE_START; adc_dma.Init.DataAlign = ADC_DATAALIGN_RIGHT; adc_dma.Init.ScanConvMode = ADC_SCAN_DISABLE; adc_dma.Init.NbrOfConversion = 1; adc_dma.Init.DiscontinuousConvMode = DISABLE; adc_dma.Init.NbrOfDiscConversion = 0; HAL_ADC_Init(&adc_dma); HAL_ADCEx_Calibration_Start(&adc_dma); ADC_ChannelConfTypeDef adc_ch; adc_ch.Channel = ADC_CHANNEL_0; adc_ch.Rank = ADC_REGULAR_RANK_1; adc_ch.SamplingTime = ADC_SAMPLETIME_1CYCLE_5; HAL_ADC_ConfigChannel(&adc_dma, &adc_ch); dma.Instance = DMA1_Channel1; dma.Init.Direction = DMA_PERIPH_TO_MEMORY; dma.Init.PeriphInc = DMA_PINC_DISABLE; //Adres rejestru danych przetwornika jest stały, więc wyłączamy zwiększanie adresu dma.Init.MemInc = DMA_MINC_ENABLE; //chcemy zapisywać w kolejnych zmiennych, włączamy więc zwiększanie adresu w pamięci dma.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD; //użyjemy 16-bitowych wartości do przechowywania wyników dma.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD; // dma.Init.Mode = DMA_NORMAL; //pozwala na pobieranie kolejnych danych do tego samego bufora dma.Init.Priority = DMA_PRIORITY_HIGH; HAL_DMA_Init(&dma); __HAL_LINKDMA(&adc_dma, DMA_Handle, dma); //powiązanie - kanał DMA z modułem ADC HAL_DMA_IRQHandler(&dma); HAL_ADC_IRQHandler(&adc_dma); HAL_ADC_Start_DMA(&adc_dma, (uint32_t*)bufor, 128); if(HAL_ADC_Start_DMA(&adc_dma, (uint32_t*)bufor, 128)!= HAL_OK) { while(1); } HAL_ADC_Start(&adc_dma);
  2. Witam, jak osiągnąć maksymalny sampling rate na ADC + DMA? SysClock ustawiony na 72Mhz. APB2CLKDivider i APB1CLKDivider ustawione na 1. ADC leci w ContinuousConvMode = ENABLE i ExternalTrigConv = ADC_SOFTWARE_START; SamplingTime = ADC_SAMPLETIME_13CYCLES_5; DMA zapisuje do bufora[128] z jednego kanału ADC i wysyłam sobie to na ekran co jakiś czas. Oczekuję zapisu badania sygnału do 20kHz, jak na razie nie łapie mi poprawnie nawet sygnału 9kHz, Co tu zrobić, dać zewnętrzny trigger z jakiegoś timera ustawionego na przerwanie co 44.1kHz? Jest to szybsze?
  3. Możesz po prostu napisać w jakim przedziale występuje jakakolwiek regulacja, lub jeśli dysponujesz, zarzucić wykresem napięcia od wypełnienia, było by mi niezmiernie miło Skombinuję zegarek na sterydach - Mikrokontroler na zegarku 16MHz
  4. Nie mogę doczytać jakiego zakresu regulacji napięcia na SEPIC mogę się spodziewać, oraz jaki zakres wypełnienia PWM będzie wpływał na regulację. Schemat wyliczył mi program Würth Elektronik Component Selector
  5. Jak na razie coś takiego, trudno mi czas na to znaleźć, sporo skopiowane z schematów dostępnych w sieci czy ładowarki imax, co do zasilenia uC, to się zastanawiam, jak by to tu zrobić, by bateria nie siadała za szybko. Na końcu mam zaciski obciążenia (load), jest ono sterowane przez mosfet'a, gdyby tak zabrać z BAT + za pomocą przycisku napięcie do osobnego stabilizatora(stab2) 5V, a z tego przez diodę do +5 uC, następnie załączyć mosfeta i zabrać już napięcie z Load przez diodę do stabilizatora stab(2), taka pętla, po prostu nie mam pojęcia jak to ogarnąć, sam nie wiem na ile dobrze zrobiłem schemat tej ładowarki... adowarka.zip
  6. Dokładnie, samowystarczalne źródło dźwięku, a do tego słowo klucz - przenośne, i właśnie dlatego lipo, mała masa. No, a te zabawy z ładowaniem to po prostu przymus, potrzebuję ponad 20V by wzmacniacz wydał z siebie te 50W. Wcześniej miałem równolegle w pakiecie 2s, te akumulatory, miałem do 2s ładowarkę balansującą, ale przetwornica do wzmacniacza nie wyrabiała jak miała podciągać do 24V z 7V. A cena akumulatorków, no nie wchodzi za bardzo w grę, i też dlatego zależy mi na wbudowanym balansowaniu i zabezpieczeniu, bo te akumulatorki są z odzysku, a wiadomo jak z takimi jest... Praca bez możliwości jednoczesnego ładowania nie wchodzi w grę, no niby litowców nie powinno stonować się do pracy buforowej, ale te baterie i tak idą na dobicie. Rozmiary całej kolumienki nie są wielkie, jak od średniej wierzy do pokoju, jakieś 20x40x30cm. Bardzo przydatne też do akademika, wiadomo, nie każdy ma tam sprzęt audio, a na takiej kolumience już można poszaleć Walory edukacyjne, wiadomo jak zawsze, ale w moim przypadku, chyba po prostu lubię sobie komplikować życie
  7. Dzięki, przekonałeś mnie do tego balansera na rezystorach, to faktycznie będzie najlepsza z opcji, z resztą i tak muszę zrobić przetwornice a uC i tak będzie tam siedział, więc czemu nie. Układ będzie zasilał kolumienkę plenerową (coś jak by piecyk) moc to około 50W, no i problem był w tym, że wszystko ma być zabudowane, a wiadomo, ładowarki zazwyczaj się nie wozi a zasilacz do laptopa zawsze gdzieś się plącze. Te wszystkie gotowe zestawy nie są za wiele warte, przynajmniej dla mnie. A i taki układ zawsze się przyda do wszystkiego innego Dzięki jeszcze raz
  8. te przetwornice DC/DC wydaje mi się, że nie przejdą, bym musiał rozłączać akumulatory, chodzi mi o te płytki z alledrogo ładujące i zabezpieczające baterię, mam takie 2 moduły i razem nie chcą współpracować. Wykorzystam taki układ, jako zasilanie zasilacz laptopy (21V) i przetwornica podbijająca do 25,2V, następnie LM317 z ograniczeniem prądowym do 500mAh, może troszkę więcej. Baterie to odzysk 18650, więc coś około 1500mAh. Do tego zaciągnę jeszcze jakiś uC do sprawdzania napięć na akumulatorkach, oraz będzie odłączał obciążenie z baterii przez mosfeik, oraz może ładowanie. Nie podoba mi się bardzo rozwiązanie... Troszkę pokomplikowane, ale jedna z łatwiejszych opcji. Może lepiej było by to wykonać na LM'kach, porobić źródła prądowe, na napięcia GND -||- 4,2V -||- 8,4V -||- 12,6V -||- itd... -||- <- Akumulatorek Tylko przy założeniu, że ładuję prądem stałym, napięcie będzie powoli rosnąć więc różnica pomiędzy źródłami, 4,2V, może dojść do wartości 5,4V. GND -||- 3V -||- 8,4V -||-... Dalej średnio to widzę, może kontrolować wszystkie napięcia za pomocą uC i je zmieniać na bieżąco?
  9. Witajcie. Zastanawiam się w jaki sposób ładować pakiet 6S baterii Li-Ion. Z założenia układ ma się sam balansować, zabezpieczyć przed przeładowaniem i rozładowaniem. Zastanawiałem się nad LM317 z ograniczeniem prądowym, i po jednym takim układzie na każdą celę, tylko co z masą? robić wspólną? porobią się chyba zwarcia, nie wiadomo jak by to działało, potrzebna by była symulacja. Na blogu mdiy widziałem balanser fajnie działający, tylko taki układ potrzebuje zasilania stabilizowanego oraz z ograniczeniem prądowym, czyli dobry zasilacz/ładowarka. Najlepsze co mam pod ręką to zasilacz laptopowy, czyli napięcie trzeba podbić a następnie jakiś zasilacz co mi to ustabilizuje i da CC. Najchętniej wykonał bym układ dedykowany pod uC, tylko czy ma ktoś jakiś pomysł, jak by to z grubsza miało wyglądać? Jaką metodę zastosować, jakie komponenty, tak mniej więcej, potrzebuję troszkę inspiracji. Pozdrawiam
  10. No własnie, że też wcześniej o tym nie pomyślałem... 16MHz + timer 16'sto bitowy i mamy naprawdę wspaniałą dokładność(62,5ns +- jakiś tam błąd) taka dokładność mi w 100% wystarcza. Najprostsze rozwiązanie okazało się wystarczające. Dzięki wielkie za pomoc, naprawdę nawet nie pomyślałem o odczytywaniu wartości z timera, jeszcze raz dzięki wielkie. Pozdrawiam
  11. Timer nie liczy 10us tylko 1us, stąd wartość wpisywana to 15. Nie uparłem się na przerwania, jak na moje pomiar może być dokonywany nawet za pomocą wróżki, byle by był dokładny, wybrałem przerwania ze względu na to, iż rozumiem je po części i wiem mniej więcej jak działają. Przerwania używam tylko do zliczania ilości przepełnień, nie wiem na ile jest to dokładne, bo skąd mam wiedzieć takie szczegóły? Timer jest stratowany zaraz po wykryciu stanu niskiego na pind.2 i sprawdzeniu 2 innych warunków, procesor nic w tym czasie innego nie robi, tak samo czeka na zatrzymanie timera tylko na pind.3 tyle że tu już wchodzą przerwania od timera0 Jak jest inna możliwość startowania i zatrzymywania timera, tak aby startował i stopował na określony stan na określonym pinie to chętnie się dowiem jaki to sposób. Tryb CTC? w swojej literaturze odnośnie BASCOMA nie było nawet wzmianki, w necie troszę poczytałem, że służy do generowania impulsów o określonym czasie i na tym się kończy. Co do możliwości uC, wiem jak duże są, wiem, że taki układ jaki ja próbuję zrobić już istnieje, i to w dodatku na taktowaniu 4MHz, i chyba na przerwaniach, bo czujniki podpięte są pod porty INT. Możliwości tego uC są wielkie, lecz niestety moje już takie nie są.
  12. Zmieniłem już swoją koncepcję, teraz wygląda to tak: $regfile = "m8adef.dat" $crystal = 16000000 Config Lcd = 16 * 2 Cursor Off Config Lcdpin = Pin , Db7 = Portc.5 , Db6 = Portc.4 , Db5 = Portc.3 , Db4 = Portc.2 , E = Portc.1 , Rs = Portc.0 Config Timer0 = Timer , Prescale = 1 Config Portd = Input Config Portb.0 = Output Portb.0 = 1 Set Portd Dim Czujka As Byte Dim Y As Bit , X As Bit Dim 10us As Long Dim Mps As Single , Fps As Single , Us As Single Dim Napfps As String * 10 , Napmps As String * 10 'On Int0 Startt 'On Int1 Stopt On Timer0 Czas Enable Interrupts Enable Int0 Enable Int1 Enable Timer0 Stop Timer0 Load Timer0 , 15 10us = 0 X = 0 Y = 0 Cls Lcd " Chrono V.2 " Lowerline Lcd " By Tded " If Pind.2 = 0 Then Locate 1 , 1 Lcd "#" End If If Pind.3 = 0 Then Locate 1 , 16 Lcd "#" End If Do If Pind.2 = 0 And X = 0 Then Set X Portb.0 = 0 Start Timer0 End If If Pind.3 = 0 And Y = 0 And X = 1 Then Stop Timer0 Portb.0 = 1 Reset X Set Y End If If Y = 1 Then Cls Incr Czujka Us = 10us * 0.0001 Mps = 1 / Us Fps = Mps * 3.2808399 Napmps = Fusing(mps , "#.##") Napfps = Fusing(fps , "#.##") Lcd Napfps ; " f/s"; Locate 1 , 15 Lcd Czujka Lowerline Lcd 10us ; " " ; Napmps ; " m/s" Reset Y 10us = 0 End If Loop End Czas: Incr 10us Load Timer0 , 15 Return Wszystko działa. LEcz dalej będe musiał zwiększyć szybkość sprawdzania, teraz mam dokładność około 3 stóp na sekundę (fps), a chcę zejść do jednej. Takie dosyć szybkie testy są potrzebne by dość dokładnie wyliczyć szybkość poruszającego się obiektu o średnicy 6mm i prędkości około 120m/s(wartość wyliczana) na odcinku 10cm...
  13. Pozbyłem się przerwań int, dałem kwarc 16MHz, bo na 8 miałem błędne wyniki, chyba przerwania timera0 uciekały? Może przerwanie timer0 tez da się wyeliminować?
  14. Witam. Mam problem z przerwaniami. Chcę przerwaniem INT0 uruchomić timer0 a przerwaniem INT1 go zatrzymać. Czy jest taka możliwość? $regfile = "m8adef.dat" $crystal = 8000000 Config Lcd = 16 * 2 Cursor Off Config Lcdpin = Pin , Db7 = Portc.5 , Db6 = Portc.4 , Db5 = Portc.3 , Db4 = Portc.2 , E = Portc.1 , Rs = Portc.0 Config Timer0 = Timer , Prescale = 1 Config Portd = Input Set Portd Dim Czujka As Byte Dim Y As Bit Dim X As Bit Dim 1us As Word On Int0 Startt On Int1 Stopt On Timer0 Czas Enable Interrupts Enable Int0 Enable Int1 Timer0 = 7 1us = 0 Cls Lcd " Chrono VER.1 " Lowerline Lcd " By Tded " Wait 1 Cls Lcd Czujka Lowerline Lcd 1us Do If Y = 1 Then Disable Interrupts Cls Incr Czujka Lcd Czujka Lowerline Lcd 1us Reset Y Reset X 1us = 0 Enable Interrupts End If Loop End Startt: If X = 0 Then Enable Timer0 Timer0 = 7 Set X End If Return Czas: Timer0 = 7 Incr 1us Return Stopt: If Y = 0 Then Disable Timer0 Set Y End If Return Kompletnie już nie wiem jak to dalej popchnąć do przodu, założenie jest całkiem proste: 2 czujniki podpięte pod INT0/1, za pomocą których chcę zmierzyć czas przejazdu. Jeden czujnik ma wystartować zegar (bardzo dokładny przepełnienie timer0 co 1us) a drugi ma zatrzymać pomiar. Z góry dziękuję za pomoc i pozdrawiam.
  15. Witam. Otrzymałem od kolegi heli zabawkę z spalonym silnikiem, wymontowałem układ sterujący, były tam 2 scali jeden miał oznaczenia HS153SN-J a drugi jakieś dziwne znaki, więc go olałem. HS153SN-J nie znalazłem do niego Datasheeta, miernikiem posprawdzałem i znalazłem te 3 kanały. Podłączyłem pod ADC w Atmega8 + dzielnik napięcia, który na wewnętrznym napięciu odniesienia dawał mi zakres do 15V, lecz ku mojemu zdziwieniu na wyświetlaczu ujrzałem wartości 136, 201, 201 (odczyty z ADC bez zmiany na V) które z co kilka sekund zmieniały się na 0. Ruszanie wajchami pilota (nie wiem jak się to "fachowo" nazywa) zmieniało tylko częstotliwość zmian odczytu ADC na 0. Najprawdopodobniej na tym scalaku mam sygnał PWM, tylko dlaczego przetwornik ADC ma z nim problemy? Jak to podłączyć by procesor prawidłowo czytał tak jak multimetr, który z tym nie ma problemu. Z góry dziękuję za pomoc.
×
×
  • Utwórz nowe...