Jump to content
ELFORUM - Forumul Electronistilor

nico_2010

Moderatori
  • Content Count

    2,175
  • Joined

  • Last visited

Community Reputation

43 Se poate si mai bine

About nico_2010

  • Rank
    Membru avansat

Profile Information

  • Locatie
    Bucuresti

Recent Profile Visitors

3,355 profile views
  1. nico_2010

    Un modest tutorial STM32F103C8T6 (Bluepill)

    @mars01 ai perfecta dreptate si recunosc ca de acest aspect m-am lovit si eu de curand cand am inceput sa lucrez la softul pentru o punte RCL (la care partea de hard este cam gata). Momentan, folosesc o placa de dezvoltare Nucleo F303RE si, cel putin in stadiul asta, deja am consumat circa 20k Flash si 2k RAM si nu vreau inca sa stiu care va fi finalul. Este foarte posibil asa fiu nevoit sa trec pe SPL sau, poate si mai convenabil, direct la programarea registrilor - acolo unde este cazul - pentru a ma incadra in posibilitatile unui STM32F100C6T6. Vom vedea. L.E.: Care a fost nivelul de optimizare in cele doua cazuri?
  2. nico_2010

    invertor sinus pur

    Schema initiala era cu cate un IRF540, nu cu 3 bucati. Transformatorul, in prima postare, era subdimensionat. Si ca sa destindem atmosfera, nu-i asa, mai ales ca initiatorul s-ar parea ca este cam ocupat cu alte probleme (nimeni nu-l poate judeca pentru asta) am sa blochez topicul. Deblocarea se va face la cererea initiatorului topicului.
  3. nico_2010

    Send less current to male the more power efficient circuit

    Hi, In this case Google is your friend! Check this: http://henrysbench.capnfatz.com/henrys-bench/arduino-projects-tips-and-more/powering-the-esp-12e-nodemcu-development-board/
  4. nico_2010

    invertor sinus pur

    Pentru pct.1: Nu stiam ca un transformator poate avea "baterie" sau "baterii" ci, cel mult, infasurari. Dar la domnia dvs. este scuzabil... Pentru pct.2: Ba da, poti avea pretentia ca un port digital sa comande corect un MOS-FET (cu referire directa la IRF540), daca citesti cu atentie graficele (fig.1, fig.2, fig.3) de la pag.3 de aici: https://www.vishay.com/docs/91021/91021.pdf. Nu neg insa ca ar fi util sa foloseasca un driver pushpull cu tranzistoare, insa la circa 62kHz (maxim) cat ar fi frecventa purtatoarei nu apar probleme deosebite.
  5. nico_2010

    Probleme cu arduino

    Esti convins ca ai conectat corect afisorul? Simptomele descrise arata ca afisorul nu s-a initializat corect. Cauze: - tensiune de alimentare incorecta; - inversarea SCL cu SDA; - lipsa traseu de masa; - schimbarea adresei LCD. LE: Poti sa explici cum anume a functionat corect un timp? Afisorul era conectat la Arduino Nano? Rezistentele de pull-up exista fizic pe adaptorul I2C.
  6. nico_2010

    Un modest tutorial STM32F103C8T6 (Bluepill)

    Sunt de acord cu tine ca volumul de informatie este mare si descurajant, insa nu cred ca trebuie sa inveti pe dinafara tot manualul. Cred ca accesarea acelor informatii care sa te ajute atunci cand scrii un program (de exemplu, rutina de tratare a intreruperii pentru un timer sau ADC) te scuteste de multe migrene. Ar fi suficient sa dai click pe fisierul care contine functiile pentru gestionarea perifericului respectiv (ex. stm32f1xx_hal_adc.c, stm32f1xx_hal_tim.c) si in fereastra din dreapta a IDE Atollic vei avea toate functiile continute.
  7. nico_2010

    Un modest tutorial STM32F103C8T6 (Bluepill)

    Si ce obtinem in realitate;
  8. nico_2010

    Un modest tutorial STM32F103C8T6 (Bluepill)

    M-am decis sa continui cu acest mic tutorial, incurajat fiind doar de numarul mare de vizualizari.Cat despre reactii ... cateva, raportate la numarul de vizualizari. Sper totusi ca ceea ce prezint aici, asa, in stilul meu mai putin pedagogic, sa foloseasca celor care vor sa invete despre aceste microcontrollere puternice si foarte versatile. In continuare ramanem cantonati la timere si voi prezenta o modalitate de a genera semnal sinusoidal folosind functia de generator de PWM (STM32F103C8T6 nu dispune de DAC). Ideea de baza este aceea de a genera pulsuri cu latimea variabila care, prin filtrare, sa duca la obtinerea unui semnal sinusoidal. Pentru asta apelam la tehnica DDS, conceptul de baza fiind de a calcula faza la fiecare moment de eșantionare. În general, pentru o frecvență arbitrară de eșantionare Fsample și frecvența dorita Fout, faza trebuie să crească cu R = 2 * pi * ( Fout/Fsample) la fiecare moment de eșantionare. Pentru setari, urmati primii doi pasi din postarea#1 si faceti selectia asa cum este prezentata in figura de mai jos: Dupa cum se vede am selectat pentru aceasta aplicatie timerul TIM2 si canalul 1 al acestuia pentru generarea de semnal PWM. Selectam tab-ul "Clock Configuration" si facem setarile pentru semnalul de ceas, ca mai jos: Pasul urmator ar fi, in mod normal sa configuram Timer-ul 2 pentru functia de generare a semnalului PWM, asa ca selectam tab-ul "Configuration" si procedam in felul urmator: - Selectam butonul "TIM2" si se deschide fereastra de configurare propriu-zisa. La sectiunea "PWM Generation Channel 1", in dreptul setarii "Mode" alegeti "PWM mode 1" din fereastra defilanta si apasati butonul "Apply" (vezi mai jos) Selectati tabul "NVIC Settings" si vom bifa in noua fereastra "TIM2 Global Interrupt", asta pentru avem nevoie ca timerul sa lucreze in regim de intreruperi. In final setam portul de iesire sa functioneze in regim de push-pull si cu o viteza maxima: Salvam totul sub un nume convenabil si generam proiectul, care, asa cum am mai spus, va contine doar setarile in stare de reset ale microcontroller-ului. Acesta este fisierul "main.c", asa cum este generat de CubeMX si completat de mine cu variable si alte cele necesare functionarii proiectului. /** ****************************************************************************** * @file : main.c * @brief : Main program body ****************************************************************************** ** This notice applies to any and all portions of this file * that are not between comment pairs USER CODE BEGIN and * USER CODE END. Other portions of this file, whether * inserted by the user or by software development tools * are owned by their respective copyright owners. * * COPYRIGHT(c) 2018 STMicroelectronics * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * 3. Neither the name of STMicroelectronics nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************** */ /* Includes ------------------------------------------------------------------*/ #include "main.h" #include "stm32f1xx_hal.h" /* USER CODE BEGIN Includes */ /* USER CODE END Includes */ /* Private variables ---------------------------------------------------------*/ TIM_HandleTypeDef htim2; /* USER CODE BEGIN PV */ /* Private variables ---------------------------------------------------------*/ #define POW232 4294967296 //valoarea 2^32 uint16_t sinetable[] = { 256, 262, 269, 275, 281, 287, 294, 300, 306, 312, 318, 324, 330, 336, 342, 348, 354, 360, 365, 371, 377, 382, 388, 393, 398, 403, 408, 413, 418, 423, 428, 433, 437, 441, 446, 450, 454, 458, 462, 465, 469, 472, 476, 479, 482, 485, 487, 490, 493, 495, 497, 499, 501, 503, 504, 506, 507, 508, 509, 510, 511, 511, 512, 512, 512, 512, 512, 511, 511, 510, 509, 508, 507, 506, 504, 503, 501, 499, 497, 495, 493, 490, 487, 485, 482, 479, 476, 472, 469, 465, 462, 458, 454, 450, 446, 441, 437, 433, 428, 423, 418, 413, 408, 403, 398, 393, 388, 382, 377, 371, 365, 360, 354, 348, 342, 336, 330, 324, 318, 312, 306, 300, 294, 287, 281, 275, 269, 262, 256, 250, 243, 237, 231, 225, 218, 212, 206, 200, 194, 188, 182, 176, 170, 164, 158, 152, 147, 141, 135, 130, 124, 119, 114, 109, 104, 99, 94, 89, 84, 79, 75, 71, 66, 62, 58, 54, 50, 47, 43, 40, 36, 33, 30, 27, 25, 22, 19, 17, 15, 13, 11, 9, 8, 6, 5, 4, 3, 2, 1, 1, 0, 0, 0, 0, 0, 1, 1, 2, 3, 4, 5, 6, 8, 9, 11, 13, 15, 17, 19, 22, 25, 27, 30, 33, 36, 40, 43, 47, 50, 54, 58, 62, 66, 71, 75, 79, 84, 89, 94, 99, 104, 109, 114, 119, 124, 130, 135, 141, 147, 152, 158, 164, 170, 176, 182, 188, 194, 200, 206, 212, 218, 225, 231, 237, 243, 250, }; #define Fsample 100000 #define Fout 1000 uint32_t r = 0; uint32_t fs = 0; uint32_t fo = 0; float temp = 0; uint16_t pulse_width = 0; uint32_t phase_accumulator = 0; uint8_t angle = 0; /* USER CODE END PV */ /* Private function prototypes -----------------------------------------------*/ void SystemClock_Config(void); static void MX_GPIO_Init(void); static void MX_TIM2_Init(void); void HAL_TIM_MspPostInit(TIM_HandleTypeDef *htim); /* USER CODE BEGIN PFP */ /* Private function prototypes -----------------------------------------------*/ /* USER CODE END PFP */ /* USER CODE BEGIN 0 */ /* USER CODE END 0 */ /** * @brief The application entry point. * * @retval None */ int main(void) { /* USER CODE BEGIN 1 */ /* USER CODE END 1 */ /* MCU Configuration----------------------------------------------------------*/ /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ HAL_Init(); /* USER CODE BEGIN Init */ /* USER CODE END Init */ /* Configure the system clock */ SystemClock_Config(); /* USER CODE BEGIN SysInit */ /*Pentru a genera un semnal PWM - cu frecventa Fsample - care, prin filtrare, sa ne furnizeze un semnal sinusoidal * cu frecventa Fout, vom folosi formula de calcul: R = (2^32) * Fout/Fsample */ fs = Fsample; fo = Fout; temp = (float) (1.0 / (fs / fo)); r = (uint32_t) (POW232 * temp); /* USER CODE END SysInit */ /* Initialize all configured peripherals */ MX_GPIO_Init(); MX_TIM2_Init(); /* USER CODE BEGIN 2 */ HAL_TIM_Base_Start_IT(&htim2); HAL_TIM_PWM_Start_IT(&htim2, TIM_CHANNEL_1); /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ } /* USER CODE END 3 */ } /** * @brief System Clock Configuration * @retval None */ void SystemClock_Config(void) { RCC_OscInitTypeDef RCC_OscInitStruct; RCC_ClkInitTypeDef RCC_ClkInitStruct; /**Initializes the CPU, AHB and APB busses clocks */ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; RCC_OscInitStruct.HSEState = RCC_HSE_ON; RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1; RCC_OscInitStruct.HSIState = RCC_HSI_ON; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9; if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { _Error_Handler(__FILE__, __LINE__); } /**Initializes the CPU, AHB and APB busses clocks */ RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2; RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK) { _Error_Handler(__FILE__, __LINE__); } /**Configure the Systick interrupt time */ HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000); /**Configure the Systick */ HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK); /* SysTick_IRQn interrupt configuration */ HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0); } /* TIM2 init function */ static void MX_TIM2_Init(void) { TIM_ClockConfigTypeDef sClockSourceConfig; TIM_MasterConfigTypeDef sMasterConfig; TIM_OC_InitTypeDef sConfigOC; htim2.Instance = TIM2; htim2.Init.Prescaler = 0; htim2.Init.CounterMode = TIM_COUNTERMODE_UP; htim2.Init.Period = 0; htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; if (HAL_TIM_Base_Init(&htim2) != HAL_OK) { _Error_Handler(__FILE__, __LINE__); } sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; if (HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig) != HAL_OK) { _Error_Handler(__FILE__, __LINE__); } if (HAL_TIM_PWM_Init(&htim2) != HAL_OK) { _Error_Handler(__FILE__, __LINE__); } sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK) { _Error_Handler(__FILE__, __LINE__); } sConfigOC.OCMode = TIM_OCMODE_PWM1; sConfigOC.Pulse = 0; sConfigOC.OCPolarity = TIM_OCPOLARITY_LOW; sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; if (HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_1) != HAL_OK) { _Error_Handler(__FILE__, __LINE__); } HAL_TIM_MspPostInit(&htim2); } /** Configure pins as * Analog * Input * Output * EVENT_OUT * EXTI */ static void MX_GPIO_Init(void) { /* GPIO Ports Clock Enable */ __HAL_RCC_GPIOD_CLK_ENABLE(); __HAL_RCC_GPIOA_CLK_ENABLE(); } /* USER CODE BEGIN 4 */ /* USER CODE END 4 */ /** * @brief This function is executed in case of error occurrence. * @param file: The file name as string. * @param line: The line in file as a number. * @retval None */ void _Error_Handler(char *file, int line) { /* USER CODE BEGIN Error_Handler_Debug */ /* User can add his own implementation to report the HAL error return state */ while (1) { } /* USER CODE END Error_Handler_Debug */ } #ifdef USE_FULL_ASSERT /** * @brief Reports the name of the source file and the source line number * where the assert_param error has occurred. * @param file: pointer to the source file name * @param line: assert_param error line source number * @retval None */ void assert_failed(uint8_t* file, uint32_t line) { /* USER CODE BEGIN 6 */ /* User can add his own implementation to report the file name and line number, tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ /* USER CODE END 6 */ } #endif /* USE_FULL_ASSERT */ /** * @} */ /** * @} */ /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ Mai ramane sa adaugam rutina apelata de timerul TIM2 la fiecare intrerupere, in sectiunea USER CODE BEGIN 4 ... USER CODE END 4, respectiv cea de mai jos void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { if (htim->Instance == TIM2) { if (__HAL_TIM_GET_FLAG(&htim2, TIM_FLAG_UPDATE) != RESET) { //resetare flag intrerupere __HAL_TIM_CLEAR_IT(&htim2, TIM_IT_UPDATE); } phase_accumulator += r; angle = (uint8_t) ((phase_accumulator >> 24)); pulse_width = sinetable[angle]; TIM2->CCR1 = pulse_width; //o varianta mai scurta de a trimite la portul de iesire semnalul PWM } } Compilati programul si incarcati-l in microcontroller. Prin conectarea unui filtru trece-jos la portul A0 veti obtine o frumoasa sinusoida. Un exemplu de filtru trece-jos ar fi cel de aici: Cam atat pentru azi. Si proiectul complet. sin_wave_f103.zip L.E.: Am uitat un mic "detaliu" In cadrul rutinei de setare a TIM2, trebuie introdus ce este mai jos: htim2.Init.Period = (SystemCoreClock/fs)-1; in loc de : htim2.Init.Period = 0; In lipsa acestui amanunt nu veti obtine niciun semnal.
  9. nico_2010

    automatizare distilare

    @Seppy: de ce nu ai luat tu sketch-ul de aici: http://www.artisan-distiller.net/phpBB3/viewtopic.php?p=133345&sid=09b28f151d419c99c84eff8c70d92199# la care sa adaugi comenzile specifice modulului RTC? Intreb asta pentru ca, prin preluarea unor fragmente de cod fara intelegerea actiunii lor, rezultatul este imprevizibil de cele mai multe ori sau este generator de erori "inexplicabile". @sesebe: Afirmatia asta m-a siderat: " Întotdeauna este foarte tricky sa faci ceasuri cu micronontrolere entry level "!! De unde ai tras tu concluzia ca ATMega328 este un microcontroller entry level? Sau este din categoria " Optocuploarele nu sunt compatibile cu portile TTL"?
  10. nico_2010

    Un mic ajutor cu un osciloscop Arduino Nano V3

    OK, acum mi-am adus aminte de subiect. Dupa cum arata schema de conexiuni rezolvarea problemei tale se poate doar prin inlocuirea Arduino Nano. Mai mult ca sigur partea de intrare a convertorului analog digital s-a dus.
  11. nico_2010

    Un mic ajutor cu un osciloscop Arduino Nano V3

    Un link al postarii tale anterioare te rog! Nu reusesc sa vad continutul din link-ul dat de tine.
  12. nico_2010

    Volt-Amper-230Vac-TRMS-Atmega8

    Procedeaza asa cum a zis userul Stefan. Va afisa corect cifrele. Anodul digitului cel mai din dreapta se va conecta la PB0, respectiv PB3. Softul postat pe prima pagina functioneaza corect, cel putin pe partea de afisare, insa nu am habar in ce masura functioneaza si pe partea analogica (de masura).
  13. nico_2010

    ESP8266+Wireless Pressure Sensor+Firebase

    Hello and welcome to this forum! If I understand well, the sensor works with Xbee module? Because only in this manner it became wireless, otherwise it is wired sensor. Did you activate pull-up resistor for I2C bus? Did you check if the sensor works with this scketch: https://github.com/ControlEverythingCommunity/MS5803-02BA/blob/master/Arduino/MS5803_02BA.ino If the answer is YES then you have to use Arduino IDE with ESP boards installed to make it work.
  14. nico_2010

    Cum sa faci sa nu pierzi niciodata datele de pe HDD

    Incearca pe un alt calculator cu Win7 sau o alta vwersiune mai veche de Windows..
  15. nico_2010

    USBasp

    Cred ca trebuie sa citesti si asta: http://irq5.io/2017/07/25/making-usbasp-chinese-clones-usable/ https://www.sciencetronics.com/greenphotons/?p=938 https://www.sciencetronics.com/greenphotons/?p=1937 Este posibil sa iti foloseasca. Pe mine nu ma mai preocupa de ceva timp problema programatoarelor de tipul asta.
×