سیسوگ در قسمت دوازدهم آموزش میکروکنترلر STM8 مبحث مهم و کاربردی مبدل آنالوگ به دیجیتال (ADC) را آموزش داد. در این قسمت از مجموعه مقالات قصد دارد شما را با ویژگی کاربردی تایمر نگهبان آنالوگ (Analog Watchdog) آشنا کند. با سیسوگ همراه باشید.
تایمر نگهبان آنالوگ (AWD)
AWD یکی از ویژگی های اضافی است که اکثر میکروکنترلرهای موجود در بازار این ویژگی را ندارند. AWD بسیار شبیه به مقایسه کننده است با این تفاوت که می توان حد بالا و پایین مقایسه را متناسب با نیاز خود تنظیم کنیم، در صورتی که دیگر میکروکنترلرها دارای حدود بالا و پایین ثابتی هستند. محدوده بین حدود بالا و پایین منطقه حفاظت شده نامیده می شود. فراتر از منطقه حفاظت شده AWD شروع به کار می کند.
واحد AWD در شرایطی که بخواهیم بر روی خروجی یک حسگر نظارت داشته باشیم و اقدامات سریع انجام دهیم بسیار مناسب است. به عنوان مثال، یک کنترل کننده دما را در نظر بگیرید. می خواهیم کنترل کننده بدون محاسبات پیچیده در زمانی که دمای محیط پایین تر از حد تعیین شده است سیستم گرمایش را روشن و زمانی که دما به حد بالای خود رسید سیستم گرمایش را خاموش کند. در میکروکنترلرهای دیگر این کار ساده با استفاده از دستورات شرطی IF-ELSE انجام می شود.
اتصالات سخت افزاری
نمونه کد AWD
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 | #include "STM8S.h" #include "STM8S_LCD.h" void clock_setup(void); void GPIO_setup(void); void ADC1_setup(void); void lcd_print(unsigned char x_pos, unsigned char y_pos, unsigned int value); void main() { int j; unsigned int a1 = 0x0000; clock_setup(); GPIO_setup(); ADC1_setup(); LCD_init(); LCD_clear_home(); LCD_goto(4, 0); LCD_putstr("STM8 AWD"); LCD_goto(4, 1); LCD_putstr("A1"); while (TRUE) { ADC1_ClearFlag(ADC1_FLAG_EOC); ADC1_StartConversion(); while(ADC1_GetFlagStatus(ADC1_FLAG_EOC) == 0); a1 = ADC1_GetConversionValue(); lcd_print(8, 1, a1); if(ADC1_GetFlagStatus(ADC1_FLAG_AWD)) { GPIO_WriteReverse(GPIOD, GPIO_PIN_3); ADC1_ClearFlag(ADC1_FLAG_AWD); } else { GPIO_WriteHigh(GPIOD, GPIO_PIN_3); } for(j=0;j<0x0FFF;j++); }; } void clock_setup(void) { CLK_DeInit(); CLK_HSECmd(DISABLE); CLK_LSICmd(DISABLE); CLK_HSICmd(ENABLE); while(CLK_GetFlagStatus(CLK_FLAG_HSIRDY) == FALSE); CLK_ClockSwitchCmd(ENABLE); CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV2); CLK_SYSCLKConfig(CLK_PRESCALER_CPUDIV4); CLK_ClockSwitchConfig(CLK_SWITCHMODE_AUTO, CLK_SOURCE_HSI, DISABLE, CLK_CURRENTCLOCKSTATE_ENABLE); CLK_PeripheralClockConfig(CLK_PERIPHERAL_SPI, DISABLE); CLK_PeripheralClockConfig(CLK_PERIPHERAL_I2C, DISABLE); CLK_PeripheralClockConfig(CLK_PERIPHERAL_ADC, ENABLE); CLK_PeripheralClockConfig(CLK_PERIPHERAL_AWU, DISABLE); CLK_PeripheralClockConfig(CLK_PERIPHERAL_UART1, DISABLE); CLK_PeripheralClockConfig(CLK_PERIPHERAL_TIMER1, DISABLE); CLK_PeripheralClockConfig(CLK_PERIPHERAL_TIMER2, DISABLE); CLK_PeripheralClockConfig(CLK_PERIPHERAL_TIMER4, DISABLE); } void GPIO_setup(void) { GPIO_DeInit(GPIOD); GPIO_Init(GPIOD, GPIO_PIN_2, GPIO_MODE_IN_FL_NO_IT); GPIO_Init(GPIOD, GPIO_PIN_3, GPIO_MODE_OUT_PP_HIGH_FAST); } void ADC1_setup(void) { ADC1_DeInit(); ADC1_Init(ADC1_CONVERSIONMODE_SINGLE, ADC1_CHANNEL_3, ADC1_PRESSEL_FCPU_D10, ADC1_EXTTRIG_GPIO, DISABLE, ADC1_ALIGN_RIGHT, ADC1_SCHMITTTRIG_CHANNEL3, DISABLE); ADC1_AWDChannelConfig(ADC1_CHANNEL_3, ENABLE); ADC1_SetHighThreshold(800); ADC1_SetLowThreshold(400); ADC1_Cmd(ENABLE); } void lcd_print(unsigned char x_pos, unsigned char y_pos, unsigned int value) { char chr = 0x00; chr = ((value / 1000) + 0x30); LCD_goto(x_pos, y_pos); LCD_putchar(chr); chr = (((value / 100) % 10) + 0x30); LCD_goto((x_pos + 1), y_pos); LCD_putchar(chr); chr = (((value / 10) % 10) + 0x30); LCD_goto((x_pos + 2), y_pos); LCD_putchar(chr); chr = ((value % 10) + 0x30); LCD_goto((x_pos + 3), y_pos); LCD_putchar(chr); } |
توضیحات
کد AWD درست مانند کد ADC بیان شده در قسمت دوازدهم است. با این تفاوت که در اینجا از کانال 3 استفاده کرده ایم. راه اندازی AWD ساده است. فقط کافی است محدودیت ها را تعیین کنیم و مشخص کنیم کدام کانال باید نظارت شود و AWD را فعال کنیم.
1 2 3 | ADC1_AWDChannelConfig(ADC1_CHANNEL_3, ENABLE); ADC1_SetHighThreshold(800); ADC1_SetLowThreshold(400); |
در اینجا ما مقدار 600 و 200 را به ترتیب برای حدود بالا و پایین ADC تنظیم کردیم.
در تابع اصلی، ما به سادگی وضعیت AWD را بررسی می کنیم. اگر AWD در پین PD2 رخ می دهد (خارج شدن از منطقه مرزی) LED در PD3 شروع به چشمک زدن می کند. اگر PD2 مقداری بین 400 تا 800 ADC را بدست آورد، LED روشن می شود، که نشان دهنده منطقه محافظت شده است.
1 2 3 4 5 6 7 8 9 | if(ADC1_GetFlagStatus(ADC1_FLAG_AWD)) { GPIO_WriteReverse(GPIOD, GPIO_PIN_3); ADC1_ClearFlag(ADC1_FLAG_AWD); } else { GPIO_WriteHigh(GPIOD, GPIO_PIN_3); } |
در قسمت چهاردهم آموزش میکروکنترلر STM8 سیسوگ قصد دارد تایمر نگهبان IWDG را آموزش دهد. مثل همیشه با سیسوگ همراه باشید.
لینکهای دانلود
مطالب مرتبط
- قسمت اول − میکروکنترلر STM8 چیست و از کجا آمده است؟
- قسمت دوم − معرفی بردهای Discovery میکروکنترلر STM8
- قسمت سوم − کامپایلر و پروگرامر
- قسمت چهارم − STM8CubeMX
- قسمت پنجم − آماده سازی ابزارهای نرمافزاری برای STM8
- قسمت ششم − چگونه برنامه خود را روی STM8 آپلود کنیم؟
- قسمت هفتم− LED چشمکزن
- قسمت هشتم − کلاک سیستم (CLK)
- قسمت نهم − وقفه خارجی (EXTI)
- قسمت دهم − Beeper
- قسمت یازدهم − LCD کاراکتری
- قسمت دوازدهم − مبدل آنالوگ به دیجیتال (ADC)
- قسمت سیزدهم − تایمر نگهبان آنالوگ (AWD)
- قسمت چهادهم − تایمر نگهبان (IWDG)
- قسمت پانزدهم − تایمر نگهبان محدوده ای (WWDG)
- قسمت شانزدهم− اصول اولیه تایمرها
- قسمت هفدهم− تایمر 2
- قسمت هجدهم −تایمر 4
- قسمت نوزدهم −PWM
- قسمت بیستم − PWM تایمر 1
- قسمت بیست و یکم − بررسی اجمالی ارتباطات
- قسمت بیست و دوم − رابط سریال (UART)
- قسمت بیست و سوم − رابط کاربری سریال (SPI)
- قسمت بیست و چهارم − رابط I2C
- دوره رایگان آموزش میکروکنترلر STM8 – سیسوگ
سلام وقت بخیر
اول ممنون بابت آموزش خوبتون. دوم دو تا سوال داشتم:
1. این کد در قسمت main به چه منظوری نوشته شده for(j=0;j<0x0FFF;j++);
2. فرمول های قسمت lcd_print را توضیح کوتاهی دهید و بگویی برای چه هدفی انجام می شوند.
سلام دوست عزیز
خواهش میکنم،
۱. برای ایجاد تاخیر هست عملا این موضوع
۲. اون تایع کار ساده ای رو انجام میده در واقع یه طول و عرض میگیره از شما و مقدار مود نظرتون رو در آن لوکیشن مورد نظر نمایش میده همین 🙂
در ضمن برای حمایت از ما میتونید ما رو به دوستان خودتون معرفی کنید 🙂
شما حرف ندارید …
ممنون
ممنون از لطف شما