فرستنده مادون قرمز NEC با stm8s003f3

سلام و درود.
چند وقتی هست که میخوم یه کار استارتاپی کوچیکی راه بندازم و برای اون میخوام که چند تا کنترل مادون قرمز رو کپی و با یه میکرو (و یا هر آی سی که بشه) کد هاشو دوباره به دستگاه های خاص خودشون مثل تلویزیون ارسال کنم.
این برنامه رو با آردوینو طراحی کردم و کاملا عالی کار میکرد. ولی چند تا مشکل مثل مصرف زیاد باتری، حتی موقعی که روی یه atmega8 جدا آپلود کردم به وجود اومد که به نظرم کار رو خراب میکرد.

الان به میکروی های سری st رو آوردم (به خاطر اینکه ارزون تره و انرژی هم کمتر مصرف میکنه) ولی بعد یه مدت کار کردن و یادگیریش، هنوز هیچ ایده ای ندارم که واسه فرستادن کد هام باید چیکار کنم.

در حال حاضر روی میکروی stm8s003f3 دارم کار میکنم و تا الان تونستم کار هایی در حد ساخت پالس با تایمر ها رو انجام بدم ولی هنوز دانش کافی برای ساخت برنامه هایی مثل " روشن و خاموش کردن یه led توی بازه های زمانی خیلی پایین " که هدف اصلی پروژم هست رو ندارم.

بشدت ممنون میشم اگه کسی زمینه های زیر پروژه ای انجام داده یا دانشش رو داره کمکم کنه :pray:

ساخت فرستنده مادون قرمز.
ساخت فانکشنی مثل delay_us با دقت بالا.
کار با اینتراپت های overflow تایمر ها.

یک نمونه کد های کپی شده از یک کنترل تلویزیون که با آردوینو کپی کردم هم گذاشتم.
کد دکمه خاموش و روشن benq

برای ساخت وقفه با دقت بالا با این میکرو کنترلر از مثال TIM4_TimeBase که در پوشه سمپلهای ST وجود داره استفاده کنین، در این مثال تاخیر یک میلی ثانیه رو با استفاده از تایمر و وقفه تایمر پیاده کرده روتین وقفه ها در فایل stm8s_it.c قرار داره که در مورد مثال بالا به این صورت هست:

 INTERRUPT_HANDLER(TIM4_UPD_OVF_IRQHandler, 23)
{
   TimingDelay_Decrement();
  /* Cleat Interrupt Pending bit */
  TIM4_ClearITPendingBit(TIM4_IT_UPDATE);

}

و همچنین قسمت محاسبه تنظیمات تایمر برای زمان 1 میلی ثانیه در فایل main.c به صورت زیر نوشته شده که میتونین طبق نیازتون تغییرش بدین:

static void TIM4_Config(void)
{
  /* TIM4 configuration:
   - TIM4CLK is set to 16 MHz, the TIM4 Prescaler is equal to 128 so the TIM1 counter
   clock used is 16 MHz / 128 = 125 000 Hz
  - With 125 000 Hz we can generate time base:
      max time base is 2.048 ms if TIM4_PERIOD = 255 --> (255 + 1) / 125000 = 2.048 ms
      min time base is 0.016 ms if TIM4_PERIOD = 1   --> (  1 + 1) / 125000 = 0.016 ms
  - In this example we need to generate a time base equal to 1 ms
   so TIM4_PERIOD = (0.001 * 125000 - 1) = 124 */

  /* Time base configuration */
  TIM4_TimeBaseInit(TIM4_PRESCALER_128, TIM4_PERIOD);
  /* Clear TIM4 update flag */
  TIM4_ClearFlag(TIM4_FLAG_UPDATE);
  /* Enable update interrupt */
  TIM4_ITConfig(TIM4_IT_UPDATE, ENABLE);
  
  /* enable interrupts */
  enableInterrupts();

  /* Enable TIM4 */
  TIM4_Cmd(ENABLE);
}

در آخر با توجه به ماکزیمم فرکانس کاری این میکرو (16 مگاهرتز) در وقفه ها نمیتونین کد سنگینی بنویسین و کدتون باید به قدری دستوراتش کم باش که قبل از سر ریز دوباره تایمر میکرو روتین وقفه را کامل اجرا کرده باش (که بعید میدونم بتونه :slightly_smiling_face:) ، پس راهکار استفاده از میکروهای سریعتر مثل سری stm32g0 با فرکانس کلاک 64mhz یا بیشتر کردن فاصله زمانی وقفه ها (مثلا به 100 میکرو ثانیه) هست.

3 پسندیده

میکرو‌کنترلر های دیگر را بررسی کرده اید؟
دو پیشنهاد سخت افزار میتوانم بهتون بدهم.
اولین پیشنهادم میکرو‌کنترلر های سری ۱۸ نسل جدید میکروچیپ هست.
برخی از کنترلر های این سری کم مصرف هستند و سرعتشون تا ۶۴ مگ می‌رسد.
مدل و نسل های جدید این سری از نظر منابع سخت افزار عالی هستند. واحد سخت افزاری خاصی به نام CCP یا Capture Counter PWM در این میکرو کنترلر ها وجود دارد که میتوانید با راه اندازی آن در مد Capture به راحتی زمان بندی داده های ریموت را بدست بیاورید.

گزینه دیگر میکرو کنترلر های تجاری با برند Renesas است.
سری RL78 این کمپانی، میکرو کنترلر هایی رده بالا با مصرف توان پایین و قیمتی ارزان هستند که در لوازمی که تولید تجاری میشوند بکار میروند.

2 پسندیده

وای. خیلی خیلی ممنونم. کمک خیلی بزرگی کردید. :pray: :pray: :pray:
بیشتر دنبال همین بودم. احتمالا بتونم با کمک همین بسازمش.