ARM42: 4 lempų NIXIE laikrodis

Tai keturių lempų NIXIE laikrodžio “skeletas”. Laikrodis naudoja hardwarinį RTC. PWM šviesumo valdymas, trys skaitmeniniai mygtukai, vienas analoginis (potenciometras, fotorezistorius), USB-COM jungtis laikrodžio nustatymui (sinchronizavimui). Maitinimas 9-15V. Dinaminė indikacija, vienas dešifratorius (155id1), lempas junginėja MPSA42/MPSA92 tranzistoriai. Šis modelis dabar naudoja apie 2W galios. (kogero LEDai daug naudoja 🙂 )

4 nixie clock STM32F103 RTC
Dizainas bus kuriamas kitų žmonių. Čia tik sumestos detalės, kad patikrinti elektrinę dalį ir ištestuoti programinę įrangą. Jei dizaino autoriai pasidalins galutiniu produktu, nuotraukas įdėsim.

Programos skeletas- tai minimumas programos kuris jau veikia, tačiau nepriprogramuota visokių “custom” dalykėlių kurių tikriausiai reikės galutiniam projektui.

STM32F103 RTC NIXIE clock source code, ir STM32CubeMX projektas. Kompiliuojasi su ARM gcc t.y. visiškai nuo platformos nepriklausoma C kalba.

8 replies on “ARM42: 4 lempų NIXIE laikrodis”

  1. Galvojau, čia sau darote.
    Jei tai komercinis produktas – man gėda už jį. SMPS ant 555 timerio?? Kodėl nenaudojate softwarinio SMPS ant kurio nors PWM kontrolerio? Arba normalaus hardwarinio kontrolerio? Softas – visiškas jovalas. Atsiprašau už tokį komentarą, bet sunku buvo nutylėt.

  2. Viskas cia normaliai su tuo kodu, CubeMX sugeneruotas ir kiek reikia darasyta. Taipogi, nezinau ar nesimato jums, bet cia visiskai prototipas, kad isitikint HW SW veikima, veliau jau galima normliai PCB daryt ir “slifuot” iki galo.
    555 pigu, paprasta ir neuztrigs, itampos tikslumo nereikia, gali open loop puikiai veikti. Gal vienintelis kritinis patarimas, butu pabandyt viska nuo standartinio USB maitint, 2.5W turetu uztekt.

    P.S. dariau ir as panasu projekta, in14, LPC1334 ir ESP wifi moduliukas interneto laika pasigaut ir laiko nustatymai per local web server. Jeigu Levui idomu, galeciau pasidalint keliom nuotraukom ir idomu pdf apie MPSA42/MPSA92 valdyma.

  3. Gavau kritikos, tai reikia gintis 🙂

    Kodėl 555? Todėl, kad aš turiu iš senų laikų padarytų PCB. Beja, maitblokio schema nukopijuota nuo komercinio projekto. Ar daryčiau softwarini PWM? Ne. Todėl, kad mano nuomone kišti kontrolerį (ypač tokį) į maitblokį yra kvaila. Prieš n metų dalyvavau kažkokiam freescale seminare ir ten jie labai bandė iškišti šią įdėja. Deja, vienintelis jų argumentas buvo- “juk taip galima”. Ir aišku- neremontuojamas maitblokis.
    Ar dėčiau kokį nors maitblokio čipą? Jei reikėtu maitinti iš 230V, tai tikrai taip. Jei reikia maitinti iš “bet kokio DC”, tai kogero ne.

    Dėl softo. Nu 98% softo yra sugeneruota kubiko. Ir deja tas softas nėra įprastas- čia dažnai naudojamas “call-back” principas, “weak symbols” ir chamiškas kodo perrašymas keičiantis “motininei” versijai. Todėl stengiamasi atsiriboti nuo kubiko kodo ir viskas perrašoma į “user” direktoriją.
    Vienintelė vieta kuri man labai nepatinka- rtc inicializacija. (main.c)- ten tarp kubiko sugeneruoto kodo prirašyta visokių nesąmonių. Deja, ten išlindo eilinis hardwarinis/softwarinis STM bugas, kaip po power-up, RTC laikrodis praranda kelis šimtus milisekundžių laiko. Jei paimti ir patraukinėti už laiko keliasdešimti kartų, RTC laikrodis pradeda vėluoti keliom sekundėm. Kiek mačiau ST forumuose man kažką atrašė specialistai, tai gal tą vietą koda ir pataisysim.

    Dar kode yra gana daug nenaudojamų paprogramių ir funkcijų. Jos į binarą nepapuola- gcc nesukelia šlamšto. Todėl ir gi softo source kiek per didelis.

    O šiaip, norėčiau konkretesnės kritikos, nes “softas visiškas jovalas” nėra labai informatyvu. Arba parodykit savo.

    MykeX, 555 veikia ne open-loop, o su feedback. Maitinimas iš USB nenumatytas, užsakovas taip norėjo (gautusi 13V->5V->200V. Dabar vienintelė 5V detalė yra 155id1). Ten pas juos dizaine visokios radio ir kaitrinės lempos lygtai numatytos.
    Užsakovui siūliau interneto ar GPS laiką- irgi nereikia.

  4. Jei dirbant su CubeMX pastebit RTC laikrodžio atsilikimą, reikia kiek pataisyti jo inicializaciją. Tačiau pataisymą reikia daryti sudėtingiau, kad CubeMX po pergeneravimo nesugadintu kodo…

    static void MX_RTC_Init(void)
    {
      /* USER CODE BEGIN RTC_Init 0 */
      /* USER CODE END RTC_Init 0 */
      RTC_TimeTypeDef sTime = {0};
      RTC_DateTypeDef DateToUpdate = {0};
    
      /* USER CODE BEGIN RTC_Init 1 */
      hrtc.Instance = RTC;
      hrtc.Init.AsynchPrediv = RTC_AUTO_1_SECOND;
      hrtc.Init.OutPut = RTC_OUTPUTSOURCE_ALARM;
      if ((RCC->BDCR & RCC_BDCR_RTCEN) == 0) {
      /* USER CODE END RTC_Init 1 */
    
      /** Initialize RTC Only
      */
      hrtc.Instance = RTC;
      hrtc.Init.AsynchPrediv = RTC_AUTO_1_SECOND;
      hrtc.Init.OutPut = RTC_OUTPUTSOURCE_ALARM;
      if (HAL_RTC_Init(&hrtc) != HAL_OK)
      {
        Error_Handler();
      }
    
      /* USER CODE BEGIN Check_RTC_BKUP */
      } else
        {
    	  HAL_NVIC_SetPriority(RTC_IRQn,15,0);
    	  HAL_NVIC_EnableIRQ(RTC_IRQn);
    	}
    	if(HAL_RTCEx_BKUPRead(&hrtc,RTC_BKP_DR1)!= 0x5051)
    	{
      /* USER CODE END Check_RTC_BKUP */
    .......

    Problema funkcijoje HAL_RTC_Init(), ji inicializuoja visą periferiją ir kelioms šimtosioms sekundės sustabdo laikrodį. Jau daug metų nepataiso. Todėl išeitis tokia- tikrinti ar veikia laikrodis ir apeiti tą HAL_RTC_Init, tačiau reikia papildomai paleisti pertraukimus ir minimaliai inicializuoti struktūrą. Apie tai buvo parašyta tik viename forumų poste.
    Kadangi CubeMX mėgsta trinti kodą, pataisymus reikia daryti iš tolo ir kelios eilutės dubliuojasi. Tačiau taip pataisius kodą, šios dienos STM32CubeMX nesunaikino kodo pergeneravus iš naujo.

  5. Modifikuotas RTC init’as turi bugą – jei naudojami backup registrai (o jie naudojami) reikia įjungti registrų maitinimą ir clock:

    /* USER CODE BEGIN Check_RTC_BKUP */
    } else
    {
    HAL_NVIC_SetPriority(RTC_IRQn,15,0);
    HAL_NVIC_EnableIRQ(RTC_IRQn);
    HAL_PWR_EnableBkUpAccess(); //del backup ijungimo?!
    __HAL_RCC_BKP_CLK_ENABLE(); //del backup ijungimo?!
    }
    if(HAL_RTCEx_BKUPRead(&hrtc,RTC_BKP_DR1)!= 0x5051)
    {
    /* USER CODE END Check_RTC_BKUP */

Leave a Reply

Your email address will not be published. Required fields are marked *