اطلاعیه

Collapse
No announcement yet.

راه اندازی LED RGB نواری با آردوینو (PWM)

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    راه اندازی LED RGB نواری با آردوینو (PWM)

    سلام نمیدونستم این سوالو کجا مطرح کنم اینه که تاپیکشو زدم
    این ال ای دی ها قابلیت برنامه پذیری با آردوینو یا هر میکرو دیگه ای دارن؟؟ به عبارتی adressable هستن؟؟

    #2
    پاسخ : راه اندازی LED RGB نواری با آردوینو (PWM)

    درود ، خیر این مدل ساده هست ، قیمت رو هم ببینید خیلی از آدرس پذیر کمتر هست ، در عنوان حتما باید کلمه آدرس پذیر یا برنامه پذیر و یا کد آی سی مثلاً ws2813 و ... ذکر شده باشه .
    از روی نام پین های نوار led هم میشه متوجه شد که آدرس پذیر هست یا نه ، باید پین Din یا data داشته باشه ، در مدل معمولی پایه ها rgb نامگذاری شده

    دیدگاه


      #3
      پاسخ : راه اندازی LED RGB نواری با آردوینو (PWM)

      سلام دوستان. من چند عدد هگزادسیمال رو با میکرو دریافت میکنم(0x2F64A3) میخوام عدد 2F رو داخل یک متغیر بریزم (برای کنترل led rgb) چجوری میتونم این کارو بکنم؟

      دیدگاه


        #4
        پاسخ : راه اندازی LED RGB نواری با آردوینو (PWM)

        نوشته اصلی توسط freewill نمایش پست ها
        سلام دوستان. من چند عدد هگزادسیمال رو با میکرو دریافت میکنم(0x2F64A3) میخوام عدد 2F رو داخل یک متغیر بریزم (برای کنترل led rgb) چجوری میتونم این کارو بکنم؟
        سلام
        اگر منظورتون بایت اول باشه، به صورتی که میگم. فرض میگیریم متغیر a حاوی عدد مورد نظر شما یا همون
        0x2F64A3 باشه و ما میخواییم بایت اول رو در یک متغیر هشت بیتی به اسم b بریزیم. به شکل زیر این کار امکان پذیره:
        b = (a>>16);

        دیدگاه


          #5
          پاسخ : راه اندازی LED RGB نواری با آردوینو (PWM)

          ممنون از جوابتون
          این اعداد رو توسط سریال میکرو دریافت میکنم و در متغیر ذخیره میکنم مثلا a(0)=2 و a(1)=F و... حالا میخوام این دو عدد اول رو داخل رجیستر ccr تایمر بزارم(برای تنظیم duty cycle).به این صورت:
          TIM4->CCR1=0x2F
          اما نمیدونم اینکارو چجوری انجام بدم
          ;

          دلیل: ادغام دو پست برای جلوگیری از اسپم

          نوشته اصلی توسط hossein.m98 نمایش پست ها
          سلام
          اگر منظورتون بایت اول باشه، به صورتی که میگم. فرض میگیریم متغیر a حاوی عدد مورد نظر شما یا همون
          0x2F64A3 باشه و ما میخواییم بایت اول رو در یک متغیر هشت بیتی به اسم b بریزیم. به شکل زیر این کار امکان پذیره:
          b = (a>>16);
          ممنون از جوابتون
          این اعداد رو توسط سریال میکرو دریافت میکنم و در متغیر ذخیره میکنم مثلا a(0)=2 و a(1)=F و... حالا میخوام این دو عدد اول رو داخل رجیستر ccr تایمر بزارم(برای تنظیم duty cycle).به این صورت:
          TIM4->CCR1=0x2F
          اما نمیدونم اینکارو چجوری انجام بدم

          دیدگاه


            #6
            پاسخ : راه اندازی LED RGB نواری با آردوینو (PWM)

            دیتای دریافتی رو توی آرایه میریزید؟ چه نوع آرایه ای؟ به چه ترتیب دیتا وارد میشه؟ چجوری دیتا ذخیره میشه؟
            اگر بازم مشکلی بود، سوالات بالا رو جواب بدید تا بگم به چه شکل میشه کار رو پیش برد.
            خوب من فرض میکنم دیتای شما در آرایه ای به اسم a از نوع unsigned char ذخیره میشه و طبق فرضی که گفتید خونه شماره 0 از آرایه، حاوی مقدار 2 و خونه شماره 1 حاوی مقدار F باشه و شما میخوایید مقدار 0x2F رو به رجیستر مورد نظر منتقل کنید؛ به این شکل میشه این کار رو انجام داد:

            TIM4->CCR1 = (a[0]<<4) | a[1];

            خوب من اومدم و خونه شماره 0 رو به اندازه 4 بیت شفیت دادم تا 4 بیت پر ارزش رجیستر رو پر کنه و با مقدار خونه شماره 1 یای بیتی کردم تا این هم 4 بیت کم ارزش رو پر کنه. برای حفاظت بیشتر من یکم خط بالا رو تغییر میدم تا مطمئن بشم مشکلی پیش نمیاد:

            TIM4->CCR1 = ((a[0] & 0x0F)<<4) | (a[1] & 0x0F);

            خوب اینکه چرا این کارو کردم و کد رو کمی تغییر دادم بحثش جداس و اگر بخوایید میتونم توضیح بدم. موفق باشید

            دیدگاه


              #7
              پاسخ : راه اندازی LED RGB نواری با آردوینو (PWM)

              نوشته اصلی توسط hossein.m98 نمایش پست ها
              دیتای دریافتی رو توی آرایه میریزید؟ چه نوع آرایه ای؟ به چه ترتیب دیتا وارد میشه؟ چجوری دیتا ذخیره میشه؟
              اگر بازم مشکلی بود، سوالات بالا رو جواب بدید تا بگم به چه شکل میشه کار رو پیش برد.
              خوب من فرض میکنم دیتای شما در آرایه ای به اسم a از نوع unsigned char ذخیره میشه و طبق فرضی که گفتید خونه شماره 0 از آرایه، حاوی مقدار 2 و خونه شماره 1 حاوی مقدار F باشه و شما میخوایید مقدار 0x2F رو به رجیستر مورد نظر منتقل کنید؛ به این شکل میشه این کار رو انجام داد:

              TIM4->CCR1 = (a[0]<<4) | a[1];

              خوب من اومدم و خونه شماره 0 رو به اندازه 4 بیت شفیت دادم تا 4 بیت پر ارزش رجیستر رو پر کنه و با مقدار خونه شماره 1 یای بیتی کردم تا این هم 4 بیت کم ارزش رو پر کنه. برای حفاظت بیشتر من یکم خط بالا رو تغییر میدم تا مطمئن بشم مشکلی پیش نمیاد:

              TIM4->CCR1 = ((a[0] & 0x0F)<<4) | (a[1] & 0x0F);

              خوب اینکه چرا این کارو کردم و کد رو کمی تغییر دادم بحثش جداس و اگر بخوایید میتونم توضیح بدم. موفق باشید
              ممنون بابت وقتی که گذاشتید
              بله توی آرایه میریزم.برنامه رو میزارم که مشخص بشه
              uint8_t a[10]
              HAL_UART_Receive(&huart1,a, 2, -1)
              TIM4->CCR1 = ((a[0] & 0x0F)<<4) | (a[1] & 0x0F)
              ,از پورت سریال دیتا دریافت میشه و در a(0) و a(1) ذخیره میشه.دیتای دریافتی از 00 تا ff تغیر میکنه. خروجی تایمر هم به led وصل کردم که نورش تغیر کنه.الان مشکلی که هست اینه که اعداد از 00 تا 9f درست به تایمر اعمال میشه و نور led زیاد میشه ولی وقتی عدد به a0 میرسه بجای اینکه بازهم زیاد شه،نورش کم میشه!

              دیدگاه


                #8
                پاسخ : راه اندازی LED RGB نواری با آردوینو (PWM)

                نوشته اصلی توسط freewill نمایش پست ها
                ممنون بابت وقتی که گذاشتید
                بله توی آرایه میریزم.برنامه رو میزارم که مشخص بشه
                uint8_t a[10]
                HAL_UART_Receive(&huart1,a, 2, -1)
                TIM4->CCR1 = ((a[0] & 0x0F)<<4) | (a[1] & 0x0F)
                ,از پورت سریال دیتا دریافت میشه و در a(0) و a(1) ذخیره میشه.دیتای دریافتی از 00 تا ff تغیر میکنه. خروجی تایمر هم به led وصل کردم که نورش تغیر کنه.الان مشکلی که هست اینه که اعداد از 00 تا 9f درست به تایمر اعمال میشه و نور led زیاد میشه ولی وقتی عدد به a0 میرسه بجای اینکه بازهم زیاد شه،نورش کم میشه!
                مگه دیتای شما بین 0 تا FF نیست؟ پس چه اصراری دارید که حتما در غالب 2 بایت ارسال بشه؟ با 1 بایت هم میشه. سعی کنید دیتا در غالب 1 بایت ارسال بشه؛ احتمالا مشکلات حل میشن. این که برنامه تا مقدار 9F درست کار میکنه و برای مقادیر بعد از اون دچار خطا میشه یکم جای تعجبه! مطمئنید که تایمر مورد استفاده از مقادیر بالاتر هم پشتیبانی میکنه؟ سعی کنید برای عیب یابی مقداری که به رجیستر داده میشه رو در جای دیگه ای مثل پورت خروجی یا LCD بشه دید و فهمید اشکال از برنامس یا سخت افزار. مثلا مقدار ((a[0] & 0x0F)<<4) | (a[1] & 0x0F) رو به یک LCD بدید تا نمایش بده و بشه فهمید که خروجی برای مقادیری مثل A0 حقیقتا A0 میشه یا چیز دیگه!

                دیدگاه


                  #9
                  پاسخ : راه اندازی LED RGB نواری با آردوینو (PWM)

                  نوشته اصلی توسط hossein.m98 نمایش پست ها
                  مگه دیتای شما بین 0 تا FF نیست؟ پس چه اصراری دارید که حتما در غالب 2 بایت ارسال بشه؟ با 1 بایت هم میشه. سعی کنید دیتا در غالب 1 بایت ارسال بشه؛ احتمالا مشکلات حل میشن. این که برنامه تا مقدار 9F درست کار میکنه و برای مقادیر بعد از اون دچار خطا میشه یکم جای تعجبه! مطمئنید که تایمر مورد استفاده از مقادیر بالاتر هم پشتیبانی میکنه؟ سعی کنید برای عیب یابی مقداری که به رجیستر داده میشه رو در جای دیگه ای مثل پورت خروجی یا LCD بشه دید و فهمید اشکال از برنامس یا سخت افزار. مثلا مقدار ((a[0] & 0x0F)<<4) | (a[1] & 0x0F) رو به یک LCD بدید تا نمایش بده و بشه فهمید که خروجی برای مقادیری مثل A0 حقیقتا A0 میشه یا چیز دیگه!
                  دیتایی که دریافت می کنم 6 بایت است که 2 بایت اول مورد استفاده ی من هستش.تایمر مشکلی نداره دستی مقدار دادم قبلش. مقداری که به رجیستر داده میشه مشکل داره احتمالا.روی lcd اوردمش اعداد عجیب نشون میده! تایمر مورد استفاده 16 بیتی هستش

                  دیدگاه


                    #10
                    پاسخ : راه اندازی LED RGB نواری با آردوینو (PWM)

                    نوشته اصلی توسط freewill نمایش پست ها
                    دیتایی که دریافت می کنم 6 بایت است که 2 بایت اول مورد استفاده ی من هستش.تایمر مشکلی نداره دستی مقدار دادم قبلش. مقداری که به رجیستر داده میشه مشکل داره احتمالا.روی lcd اوردمش اعداد عجیب نشون میده! تایمر مورد استفاده 16 بیتی هستش
                    تایمر در مد 16 بیتی کار میکنه یا 8 بیتی؟ چه میکروکنترلر و چه کامپایلری استفاده میکنید؟ بهتره برنامتون رو به صورت کامل قرار بدید بلکه مشکل پیدا بشه
                    راستی این اطلاعات از چه منبعی ارسال میشن؟ از صحت ارسال اطلاعات مطمئنید؟ مطمئنید همونطوری که خودتون هم گفتید مقادیر A0 به بعد واقعا درست ارسال میشن؟ اول از همه باید از صحت اطلاعات ارسالی مطمئن بود

                    دیدگاه


                      #11
                      پاسخ : راه اندازی LED RGB نواری با آردوینو (PWM)

                      نوشته اصلی توسط hossein.m98 نمایش پست ها
                      تایمر در مد 16 بیتی کار میکنه یا 8 بیتی؟ چه میکروکنترلر و چه کامپایلری استفاده میکنید؟ بهتره برنامتون رو به صورت کامل قرار بدید بلکه مشکل پیدا بشه
                      راستی این اطلاعات از چه منبعی ارسال میشن؟ از صحت ارسال اطلاعات مطمئنید؟ مطمئنید همونطوری که خودتون هم گفتید مقادیر A0 به بعد واقعا درست ارسال میشن؟ اول از همه باید از صحت اطلاعات ارسالی مطمئن بود
                      تایمر در مد 16 بیتی کار میکنه.میکرو stm32f407 هست با کامپایلر keil. اطلاعات دریافتی 100% درست هست چون چندین بار چک کردم.اطلاعات از گوشی موبایل ارسال و توسط ماژول وای فای دریافت میشه(برای کنترل led rgb) کلا فرمت اطلاعات به اینصورت هست 123456. هرجفت برای کنترل یک رنگ rgb استفاده میشه و از 00 تا ff تغیر میکنه(از 0 تا 255).برنامه رو هم واستون میفرستم ولی یکم بی نظم هست و تغیراتی داره. مثلا قبل از دریافت اطلاعات کارکتر u رو دریافت میکنم برای شروع کار

                      دلیل: ادغام دو پست برای جلوگیری از اسپم

                      #include "main.h"
                      #include "stm32f4xx_hal.h"

                      /* USER CODE BEGIN Includes */
                      int i;
                      char x[5];
                      uint8_t str[20];
                      uint8_t fgh[10];

                      char buffer[16];
                      int i = 15;

                      /* USER CODE END Includes */

                      /* Private variables ---------------------------------------------------------*/
                      TIM_HandleTypeDef htim1;
                      TIM_HandleTypeDef htim4;

                      UART_HandleTypeDef huart1;
                      UART_HandleTypeDef huart2;

                      /* USER CODE BEGIN PV */
                      /* Private variables ---------------------------------------------------------*/

                      /* USER CODE END PV */

                      /* Private function prototypes -----------------------------------------------*/
                      void SystemClock_Config(void);
                      static void MX_GPIO_Init(void);
                      static void MX_TIM1_Init(void);
                      static void MX_USART1_UART_Init(void);
                      static void MX_TIM4_Init(void);
                      static void MX_USART2_UART_Init(void);
                      static void MX_NVIC_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 */

                      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 */

                      /* USER CODE END SysInit */

                      /* Initialize all configured peripherals */
                      MX_GPIO_Init();
                      MX_TIM1_Init();
                      MX_USART1_UART_Init();
                      MX_TIM4_Init();
                      MX_USART2_UART_Init();

                      /* Initialize interrupts */
                      MX_NVIC_Init();

                      /* USER CODE BEGIN 2 */
                      HAL_TIM_Base_Start_IT(&htim1);
                      HAL_TIM_Base_Start(&htim1);

                      HAL_TIM_PWM_Start(&htim4, TIM_CHANNEL_1);
                      HAL_TIM_PWM_Start(&htim4, TIM_CHANNEL_2);
                      HAL_TIM_PWM_Start(&htim4, TIM_CHANNEL_3);

                      HAL_UART_Transmit(&huart1, "AT+CIPMUX=1\n\r", 12, 50);
                      HAL_Delay(500);
                      HAL_UART_Transmit(&huart1, "AT+CIPSERVER=1,8888\n\r", 21, 50);
                      HAL_Delay(500);
                      /* USER CODE END 2 */

                      /* Infinite loop */
                      /* USER CODE BEGIN WHILE */
                      while (1)
                      {

                      HAL_UART_Receive(&huart1, str, 1, -1);
                      if(strcmp(str,"u")==0)
                      HAL_UART_Receive(&huart1,fgh, 6, -1);



                      TIM4->CCR1 = ((fgh[0] & 0x0F)<<4) | (fgh[1] & 0xF0);
                      HAL_UART_Transmit(&huart2,fgh,6,50);
                      HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_SET);
                      }

                      if(strcmp(str,"k")==0) {
                      HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, 0);
                      }







                      /* USER CODE END WHILE */

                      /* USER CODE BEGIN 3 */

                      }
                      /* USER CODE END 3 */

                      }

                      /** System Clock Configuration
                      */
                      void SystemClock_Config(void)
                      {

                      RCC_OscInitTypeDef RCC_OscInitStruct;
                      RCC_ClkInitTypeDef RCC_ClkInitStruct;

                      /**Configure the main internal regulator output voltage
                      */
                      __HAL_RCC_PWR_CLK_ENABLE();

                      __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLT AGE_SCALE1);

                      /**Initializes the CPU, AHB and APB busses clocks
                      */
                      RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
                      RCC_OscInitStruct.HSIState = RCC_HSI_ON;
                      RCC_OscInitStruct.HSICalibrationValue = 16;
                      RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
                      RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
                      RCC_OscInitStruct.PLL.PLLM = 8;
                      RCC_OscInitStruct.PLL.PLLN = 168;
                      RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
                      RCC_OscInitStruct.PLL.PLLQ = 4;
                      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_DIV4;
                      RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;

                      if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != 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);
                      }

                      /** NVIC Configuration
                      */
                      static void MX_NVIC_Init(void)
                      {
                      /* TIM1_UP_TIM10_IRQn interrupt configuration */
                      HAL_NVIC_SetPriority(TIM1_UP_TIM10_IRQn, 0, 0);
                      HAL_NVIC_EnableIRQ(TIM1_UP_TIM10_IRQn);
                      }

                      /* TIM1 init function */
                      static void MX_TIM1_Init(void)
                      {

                      TIM_ClockConfigTypeDef sClockSourceConfig;
                      TIM_MasterConfigTypeDef sMasterConfig;

                      htim1.Instance = TIM1;
                      htim1.Init.Prescaler = 16799;
                      htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
                      htim1.Init.Period = 9999;
                      htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
                      htim1.Init.RepetitionCounter = 0;
                      if (HAL_TIM_Base_Init(&htim1) != HAL_OK)
                      {
                      _Error_Handler(__FILE__, __LINE__);
                      }

                      sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
                      if (HAL_TIM_ConfigClockSource(&htim1, &sClockSourceConfig) != HAL_OK)
                      {
                      _Error_Handler(__FILE__, __LINE__);
                      }

                      sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
                      sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
                      if (HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig) != HAL_OK)
                      {
                      _Error_Handler(__FILE__, __LINE__);
                      }

                      }

                      /* TIM4 init function */
                      static void MX_TIM4_Init(void)
                      {

                      TIM_ClockConfigTypeDef sClockSourceConfig;
                      TIM_MasterConfigTypeDef sMasterConfig;
                      TIM_OC_InitTypeDef sConfigOC;

                      htim4.Instance = TIM4;
                      htim4.Init.Prescaler = 1680;
                      htim4.Init.CounterMode = TIM_COUNTERMODE_UP;
                      htim4.Init.Period = 256;
                      htim4.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
                      if (HAL_TIM_Base_Init(&htim4) != HAL_OK)
                      {
                      _Error_Handler(__FILE__, __LINE__);
                      }

                      sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
                      if (HAL_TIM_ConfigClockSource(&htim4, &sClockSourceConfig) != HAL_OK)
                      {
                      _Error_Handler(__FILE__, __LINE__);
                      }

                      if (HAL_TIM_PWM_Init(&htim4) != HAL_OK)
                      {
                      _Error_Handler(__FILE__, __LINE__);
                      }

                      sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
                      sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
                      if (HAL_TIMEx_MasterConfigSynchronization(&htim4, &sMasterConfig) != HAL_OK)
                      {
                      _Error_Handler(__FILE__, __LINE__);
                      }

                      sConfigOC.OCMode = TIM_OCMODE_PWM1;
                      sConfigOC.Pulse = 100;
                      sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
                      sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
                      if (HAL_TIM_PWM_ConfigChannel(&htim4, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
                      {
                      _Error_Handler(__FILE__, __LINE__);
                      }

                      sConfigOC.Pulse = 120;
                      if (HAL_TIM_PWM_ConfigChannel(&htim4, &sConfigOC, TIM_CHANNEL_2) != HAL_OK)
                      {
                      _Error_Handler(__FILE__, __LINE__);
                      }

                      sConfigOC.Pulse = 250;
                      if (HAL_TIM_PWM_ConfigChannel(&htim4, &sConfigOC, TIM_CHANNEL_3) != HAL_OK)
                      {
                      _Error_Handler(__FILE__, __LINE__);
                      }

                      HAL_TIM_MspPostInit(&htim4);

                      }

                      /* USART1 init function */
                      static void MX_USART1_UART_Init(void)
                      {

                      huart1.Instance = USART1;
                      huart1.Init.BaudRate = 9600;
                      huart1.Init.WordLength = UART_WORDLENGTH_8B;
                      huart1.Init.StopBits = UART_STOPBITS_1;
                      huart1.Init.Parity = UART_PARITY_NONE;
                      huart1.Init.Mode = UART_MODE_TX_RX;
                      huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
                      huart1.Init.OverSampling = UART_OVERSAMPLING_16;
                      if (HAL_UART_Init(&huart1) != HAL_OK)
                      {
                      _Error_Handler(__FILE__, __LINE__);
                      }

                      }

                      /* USART2 init function */
                      static void MX_USART2_UART_Init(void)
                      {

                      huart2.Instance = USART2;
                      huart2.Init.BaudRate = 9600;
                      huart2.Init.WordLength = UART_WORDLENGTH_8B;
                      huart2.Init.StopBits = UART_STOPBITS_1;
                      huart2.Init.Parity = UART_PARITY_NONE;
                      huart2.Init.Mode = UART_MODE_TX_RX;
                      huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
                      huart2.Init.OverSampling = UART_OVERSAMPLING_16;
                      if (HAL_UART_Init(&huart2) != HAL_OK)
                      {
                      _Error_Handler(__FILE__, __LINE__);
                      }

                      }

                      /** Configure pins as
                      * Analog
                      * Input
                      * Output
                      * EVENT_OUT
                      * EXTI
                      */
                      static void MX_GPIO_Init(void)
                      {

                      GPIO_InitTypeDef GPIO_InitStruct;

                      /* GPIO Ports Clock Enable */
                      __HAL_RCC_GPIOC_CLK_ENABLE();
                      __HAL_RCC_GPIOH_CLK_ENABLE();
                      __HAL_RCC_GPIOA_CLK_ENABLE();
                      __HAL_RCC_GPIOB_CLK_ENABLE();
                      __HAL_RCC_GPIOD_CLK_ENABLE();

                      /*Configure GPIO pin Output Level */
                      HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_RESET);

                      /*Configure GPIO pin : PB12 */
                      GPIO_InitStruct.Pin = GPIO_PIN_12;
                      GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
                      GPIO_InitStruct.Pull = GPIO_NOPULL;
                      GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
                      HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

                      }

                      /* USER CODE BEGIN 4 */

                      /* USER CODE END 4 */

                      /**
                      * @brief This function is executed in case of error occurrence.
                      * @param None
                      * @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,
                      ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
                      /* USER CODE END 6 */

                      }

                      #endif

                      /**
                      * @}
                      */

                      /**
                      * @}
                      جدیدترین ویرایش توسط freewill; ۲۲:۵۹ ۱۳۹۷/۰۷/۱۶.

                      دیدگاه


                        #12
                        پاسخ : راه اندازی LED RGB نواری با آردوینو (PWM)

                        نوشته اصلی توسط freewill نمایش پست ها
                        تایمر در مد 16 بیتی کار میکنه.میکرو stm32f407 هست با کامپایلر keil. اطلاعات دریافتی 100% درست هست چون چندین بار چک کردم.اطلاعات از گوشی موبایل ارسال و توسط ماژول وای فای دریافت میشه(برای کنترل led rgb) کلا فرمت اطلاعات به اینصورت هست 123456. هرجفت برای کنترل یک رنگ rgb استفاده میشه و از 00 تا ff تغیر میکنه(از 0 تا 255).برنامه رو هم واستون میفرستم ولی یکم بی نظم هست و تغیراتی داره. مثلا قبل از دریافت اطلاعات کارکتر u رو دریافت میکنم برای شروع کار
                        سلام دوباره
                        من کد شما رو خیلی اجمالی بررسی کردم و فکر کنم که یجا اشتباه کردید. این خط رو ببینید:
                        TIM4->CCR1 = ((fgh[0] & 0x0F)<<4) | (fgh[1] & 0xF0); 

                        دلیلی داشته که به جای 0x0F نوشتید 0xF0؟ اگر دلیلی نداره این خط رو اصلاح کنید به شکلی که قبلا گفتم؛ البته بقیه کد رو بررسی نکردم ولی با این حال شاید مشکل حل شد

                        دیدگاه


                          #13
                          پاسخ : راه اندازی LED RGB نواری با آردوینو (PWM)

                          نوشته اصلی توسط hossein.m98 نمایش پست ها
                          سلام دوباره
                          من کد شما رو خیلی اجمالی بررسی کردم و فکر کنم که یجا اشتباه کردید. این خط رو ببینید:
                          TIM4->CCR1 = ((fgh[0] & 0x0F)<<4) | (fgh[1] & 0xF0); 

                          دلیلی داشته که به جای 0x0F نوشتید 0xF0؟ اگر دلیلی نداره این خط رو اصلاح کنید به شکلی که قبلا گفتم؛ البته بقیه کد رو بررسی نکردم ولی با این حال شاید مشکل حل شد
                          سلام و ادب
                          بعد از اینکه تست کردم و جواب نگرفتم جای 0 و f رو تغیر دادم ببینم چی میشه یادم رفت دوباره درستش کنم.ولی مشکل حل نشد
                          همه چیز رو چک کردم درسته. فقط همون خطی که گفتید خروجیش اونی نیست که میخوام.راه دیگه ای وجود نداره بنظرتون؟

                          دیدگاه


                            #14
                            پاسخ : راه اندازی LED RGB نواری با آردوینو (PWM)

                            نوشته اصلی توسط freewill نمایش پست ها
                            سلام و ادب
                            بعد از اینکه تست کردم و جواب نگرفتم جای 0 و f رو تغیر دادم ببینم چی میشه یادم رفت دوباره درستش کنم.ولی مشکل حل نشد
                            همه چیز رو چک کردم درسته. فقط همون خطی که گفتید خروجیش اونی نیست که میخوام.راه دیگه ای وجود نداره بنظرتون؟
                            ببینید من برای اینکه این خط رو امتحان کنم، برای راحتی کار اون رو با پروتئوس و avr تست کردم. به این شکل:

                            unsigned char fgh[2] = {0x0a, 0x00};
                            DDRA = 0xff;
                            PORTA = ((fgh[0] & 0x0F)<<4) | (fgh[1] & 0x0F);

                            اینم عکس از پروتئوس:

                            همونطوری که میبینید خروجی همون 0xA0 هستش که طبق کد انتظارشو داشتیم. من بازم تاکید میکنم؛ یا دیتای دریافتی مشکل داره، یا تایمر و چیزای دیگه! شما هم به نظر من با پورتی چیزی مثل من تست بگیرید و مطمئن بشید دیتا سالمه.
                            جدیدترین ویرایش توسط hossein.m98; ۲۲:۳۸ ۱۳۹۷/۰۷/۱۷.

                            دیدگاه


                              #15
                              پاسخ : راه اندازی LED RGB نواری با آردوینو (PWM)

                              نوشته اصلی توسط hossein.m98 نمایش پست ها
                              ببینید من برای اینکه این خط رو امتحان کنم، برای راحتی کار اون رو با پروتئوس و avr تست کردم. به این شکل:

                              unsigned char fgh[2] = {0x0a, 0x00};
                              DDRA = 0xff;
                              PORTA = ((fgh[0] & 0x0F)<<4) | (fgh[1] & 0x0F);

                              اینم عکس از پروتئوس:

                              همونطوری که میبینید خروجی همون 0xA0 هستش که طبق کد انتظارشو داشتیم. من بازم تاکید میکنم؛ یا دیتای دریافتی مشکل داره، یا تایمر و چیزای دیگه! شما هم به نظر من با پورتی چیزی مثل من تست بگیرید و مطمئن بشید دیتا سالمه.
                              مشکل حل شد.حق با شما بود.اطلاعات ورودی که با ترمینال میخوندم اشتباه بود.عکس زیر رو ببینید

                              فکر میکردم اطلاعات ارسالی سمت راست تصویر هست ولی سمت چپ بود(نفهمیدم اینا چه ربطی به هم دارن هنوز)
                              تنظیمات نرم افزاری که اطلاعاتو باهاش میفرستادم درست کردم اوکی شد.الان با یک بایت میفرسته
                              خیلی ممنون که راهنماییم کردین
                              راستی یه سوال دیگه.با ماژول ask کار کردید؟
                              جدیدترین ویرایش توسط freewill; ۱۹:۲۶ ۱۳۹۷/۰۷/۱۸.

                              دیدگاه

                              لطفا صبر کنید...
                              X