فهرست مطالب:
- مرحله 1: سخت افزار
- مرحله 2: ساختن
- مرحله 3: برنامه ها
- مرحله 4: درباره کد
- مرحله 5: Main.h
- مرحله 6: Main.c
تصویری: اسیلوسکوپ چهار بیتی: 6 مرحله
2024 نویسنده: John Day | [email protected]. آخرین اصلاح شده: 2024-01-30 08:56
این یک پروژه سرگرم کننده است فقط برای دیدن اینکه من تا چه اندازه می توانم یک صفحه نمایش ماتریس نقطه ای MAX7219 را فشار دهم. و به جای اجرای "بازی زندگی" ، تصمیم گرفتم "محدوده" ای با آن ایجاد کنم. همانطور که از عنوان متوجه می شوید ، این جایگزین یک اسیلوسکوپ واقعی نیست:-).
از آنجا که من قصد ندارم از این به هیچ وجه جدی استفاده کنم ، من یک برد مدار چاپی برای آن نمی سازم. شاید ، فقط شاید آن را روی یک تخته چوبی قرار دهم اما فعلاً روی تخته نان است و خواهد ماند. همچنین هیچ تقویت کننده/تضعیف کننده ورودی وجود ندارد ، شما باید سیگنالی بین 0 تا 3.3 ولت تهیه کنید ، منفی یا بیش از 3.3 ولت ندهید زیرا ممکن است به میکروکنترلر آسیب برسانید.
مرحله 1: سخت افزار
وقتی قطعات را در چین از طریق ebay یا سایت های مشابه خریداری می کنید ، ارزان ، بسیار ارزان است. از یک تخته توسعه STM32F103C8 استفاده می کند ، که گاهی اوقات "قرص آبی" نامیده می شود که من آن را حدود 2 یورو خریداری کردم (یا تقریباً هم ارزش هستند ، تا پایان سال 2018) ، دو صفحه نمایش ماتریس 8x8x4 با تراشه های MAX7219 روی آن ، خریداری شده است. قطعه 5 یورو و رمزگذار چرخشی حدود 1 یورو.
البته منبع تغذیه مورد نیاز منبع تغذیه 3.3 ولت در چند صد میلی آمپر است. تنظیم کننده ولتاژ در برد توسعه STM32F103C8 استفاده نمی شود ، نمی تواند جریان کافی را برای نمایشگرها فراهم کند. برگه داده MAX7219 مشخص می کند که ولتاژ منبع تغذیه باید بین 4.0 تا 5.5 ولت باشد اما در ولتاژ 3.3 ولت خوب کار می کند ، شاید زمانی که از آن در محیط بسیار گرم یا سرد استفاده نمی کنید ، اما در دمای 20 درجه سانتی گراد خوب است. و اکنون من مجبور نیستم از مبدل های سطح بین میکروکنترلر و صفحه نمایش استفاده کنم.
مرحله 2: ساختن
وقتی به تصویر نگاه می کنید ممکن است متوجه شوید که من از خطوط برق روی تخته های نان به طور غیر معمولی استفاده می کنم ، هر دو خط در بالا ریل مثبت و هر دو در پایین ریل زمینی هستند. این شیوه ای است که من برای انجام آن استفاده می کنم و به خوبی کار می کند ، باعث می شود تنظیمات بیشتر شبیه طرح های ترسیم شده باشد. همچنین ، من تعداد زیادی تخته کوچک با قطعاتی روی آنها قرار داده ام که می توان آنها را به تخته نان متصل کرد تا کارها را سرعت بخشید و همه آنها طوری پیکربندی شده اند که از دو خط بالا به عنوان مثبت و خطوط پایین به عنوان زمین استفاده کنند. همانطور که گفتم ، وضوح تصویر 4 بیت (16 سطح) است و از آنجا که LED های 4x8 در کنار یکدیگر وجود دارد ، فقط 32 نقطه نمونه (pts) وجود دارد. آن را با Rigol Rigol DS1054Z (8 بیتی و 12Mpts) مقایسه کنید و خواهید دید که این به سختی یک اسباب بازی است. پهنای باند واقعی چقدر است ، نمی دانم ، من آن را تا 10 کیلوهرتز آزمایش کرده ام و خوب کار می کند.
مرحله 3: برنامه ها
IDE مورد استفاده من Atollic TrueStudio است که از ابتدای سال جاری (2018) توسط ST Micro Electronics تصویب شد و به صورت رایگان ، بدون محدودیت زمانی ، بدون محدودیت اندازه کد ، بدون صفحه نمایش ناگ در دسترس است. همراه با آن ، من از STM32CubeMX استفاده می کنم ، برنامه ای که کد اولیه را به من می دهد و مقداردهی اولیه همه لوازم جانبی را ایجاد می کند. و دارای نمایشگر تمام پایه های میکروکنترلر و نحوه استفاده از آنها می باشد. حتی اگر از STM32CubeMX برای تولید کد استفاده نمی کنید ، این بسیار مفید است. یکی از چیزهایی که من دوست ندارم به اصطلاح HAL است که به طور پیش فرض STM32CubeMX است. من روش کار LowLayer را ترجیح می دهم.
برای برنامه ریزی میکروکنترلر از برنامه نویس/اشکال زدایی ST-Link ST Micro Electronics یا J-Link ساخته شده توسط Segger استفاده می کنم. هر دوی این دستگاه ها رایگان نیستند ، اگرچه می توانید نسخه های چینی آنها را با چند یورو خریداری کنید.
مرحله 4: درباره کد
آدرس MAX7219 چراغ های LED را به شیوه ای که من آنها را افقی می نامم ، نشان می دهد ، 8 چراغ در کنار یکدیگر. برای اسیلوسکوپ 8 LED های روی هم راحت تر بود ، بنابراین من یک قاب فریم ساده ایجاد کردم که با داده ها به صورت عمودی نوشته شده است و به صورت افقی مورد نیاز خوانده می شود. MAX7219 از یک کد 16 بیتی در هر 8 LED استفاده می کند ، که در آن اولین بایت برای آدرس خط انتخاب شده استفاده می شود. و از آنجا که چهار مورد از این ماژول ها در کنار هم قرار گرفته اند و ورودی های آنها به خروجی های ماژول قبل از آن متصل است ، باید 16 بیت را چهار بار ارسال کنید تا به آخرین ماژول برسید. (امیدوارم همه چیز را روشن کرده باشم …) داده ها با استفاده از SPI ، یک پروتکل ساده اما بسیار سریع ، به MAX7219 ارسال می شوند. این همان چیزی است که من با آن آزمایش می کردم ، با چه سرعتی می توانید داده ها را به MAX7219 ارسال کنید. در پایان ، من به 9 مگاهرتز برگشتم ، درست زیر حداکثر سرعتی که برگه داده تعیین می کند.
من از دو تایمر موجود در چهار تایمر STM32F103C8 استفاده می کنم ، یکی از آنها برای ایجاد پایگاه زمانی و دیگری برای خواندن رمزگذار چرخشی ، که فاصله زمانی را تنظیم می کند. TIMER3 پایگاه زمانی را تولید می کند ، این کار را با تقسیم ساعت بر 230 انجام می دهد و شمارنده را در هر 3.2 uS به روز می کند. رمزگذار دوار را می توانید انتخاب کنید تا شمارنده از 2 پالس ساعت تا 2000 پالس ساعت داشته باشد. فرض کنید شما 100 را انتخاب می کنید. TIMER3 سپس هر 320 uS یک رویداد ایجاد می کند. این EVENT باعث می شود ADC یک نمونه از سیگنال ورودی را ضبط کند و از آنجا که 32 نمونه برای یک نمایشگر گرفته می شود ، پس از تقریبی کامل می شود. 10 میلی ثانیه در 10mS شما می توانید یک طول موج 100 هرتز ، یا دو نفر از 200 هرتز و غیره را متناسب کنید. با عبور از بیش از 3 موج در هر صفحه ، تشخیص شکل موج بسیار دشوار می شود.
در بقیه موارد ، من فقط می توانم شما را به کد ارجاع دهم ، دنبال کردن آن سخت نیست ، حتی اگر فقط تجربه کار با آردوینو را دارید. در واقع ، شما می توانید همین کار را با آردوینو بسازید ، اگرچه من شک ندارم که به سرعت "قرص آبی" کار کند. STM32F103C8 یک میکروکنترلر 32 بیتی است که با سرعت 72 مگاهرتز کار می کند ، دارای دو وسیله جانبی SPI و یک ADC بسیار سریع است.
مرحله 5: Main.h
#ifndef _MAIN_H _#تعریف _MAIN_H_
#شامل "stm32f1xx_ll_adc.h"
# شامل "stm32f1xx_ll_rcc.h" # شامل "stm32f1xx_ll_bus.h" # شامل "stm32f1xx_ll_system.h" # شامل "stm32f1xx_ll_exti.h" # شامل "stm32f1xx_ll_cortex.h" # شامل "stm32f1xx_ll_utils.h" # شامل "stm32f1xx_ll_pwr.h" # شامل "stm32f1xx_ll_dma.h" #شامل "stm32f1xx_ll_spi.h" #شامل "stm32f1xx_ll_tim.h" #شامل "stm32f1xx.h" #شامل "stm32f1xx_ll_gpio.h"
#ifndef NVIC_PRIORITYGROUP_0
# تعریف NVIC_PRIORITYGROUP_0 ((uint32_t) 0x00000007) # تعریف NVIC_PRIORITYGROUP_1 ((uint32_t) 0x00000006) # تعریف NVIC_PRIORITYGROUP_2 ((uint32_t) 0x00000005) # تعریف NVIC_PRIORITYGROUP_3 ((uint32_t) 0x00000004) # تعریف NVIC_PRIORITYGROUP_4 ((uint32_t) 0x00000003) #endif
#ifdef _plusplus
خارجی "C" {#endif void _Error_Handler (char *، int)؛
#تعریف Error_Handler () _Error_Handler (_ FILE_، _LINE_)
#ifdef _plusplus} #endif
#اندیف
مرحله 6: Main.c
#شامل "main.h" خلاء استاتیک LL_Init (خالی) ؛ void SystemClock_Config (خالی) ؛ خلاء استاتیک MX_GPIO_Init (خالی) ؛ خلاء استاتیک MX_ADC1_Init (خالی) ؛ خلاء استاتیک MX_SPI1_Init (خالی) ؛ خلاء استاتیک MX_SPI2_Init (خالی) ؛ خلاء استاتیک MX_TIM3_Init (خالی) ؛ خلاء استاتیک MX_TIM4_Init (خالی) ؛
uint16_t SPI1_send64 (uint16_t data3 ، uint16_t data2 ، uint16_t data1 ، uint16_t data0) ؛
uint16_t SPI2_send64 (uint16_t data3 ، uint16_t data2 ، uint16_t data1 ، uint16_t data0) ؛ void MAX7219_1_init ()؛ void MAX7219_2_init ()؛ void erase_frame_buffer (void)؛ void fill_frame_buffer (خالی)؛ void display_frame_buffer (void)؛ void set_timebase (خالی)؛
uint8_t نمایش بالای صفحه [4] [8]؛ // vier bytes naast elkaar، acht onder elkaar
uint8_t نمایش کمتر_ [4] [8]؛ // deze twee samen vormen de frame-buffer
uint8_t sample_buffer [32]؛ // buffer voor de resultaten van ADC
int main (باطل)
{LL_Init ()؛ SystemClock_Config ()؛ MX_GPIO_Init ()؛ MX_ADC1_Init ()؛ MX_SPI1_Init ()؛ MX_SPI2_Init ()؛ MX_TIM3_Init ()؛ MX_TIM4_Init ()؛
LL_SPI_Anable (SPI1) ؛
LL_SPI_Anable (SPI2) ؛
LL_TIM_EnableCounter (TIM3) ؛
LL_TIM_EnableCounter (TIM4) ؛
LL_ADC_Enable (ADC1) ؛
LL_ADC_REG_StartConversionSWStart (ADC1) ؛ LL_ADC_EnableIT_EOS (ADC1) ؛
LL_mDelay (500) ؛ // MAX7219 به مدتی بعد از روشن شدن نیاز دارد
MAX7219_1_init ()؛ MAX7219_2_init ()؛
// LL_TIM_SetAutoReload (TIM3 ، 9) ؛
در حالی که (1)
{set_timebase ()؛ erase_frame_buffer ()؛ fill_frame_buffer ()؛ display_frame_buffer ()؛ }}
void erase_frame_buffer (خالی)
{int8_t x؛ int8_t y؛
برای (x = 0؛ x <4؛ x ++) // kolom_bytes {
برای (y = 0 ؛ y <8؛ y ++) // lijnen {نمایش_بالایی [x] [y] = 0 ؛ // alle bitjes op nul lower_display [x] [y] = 0؛ }}}
void fill_frame_buffer (خالی)
{uint8_t y = 0؛ // ولتاژ uint8_t tijd = 0؛ // tijd uint8_t display_byte؛ // 8 بیت ناست الکاار را در تاریخ 4 بیشتر از این در uint8_t display_bit رها می کند؛
برای (tijd = 0؛ tijd <32؛ tijd ++) {display_byte = tijd / 8؛ display_bit = 7 - (tijd٪ 8) ؛
y = sample_buffer [tijd]؛
if (y> 7) // در صفحه نمایش بالا schrijven
{نمایش_بالایی [display_byte] [15-y] | = (1 << نمایش_بیت)؛ } else // در صفحه نمایش پایین schrijven {lower_display [display_byte] [7-y] | = (1 << display_bit)؛ }}}
void display_frame_buffer (void)
{
uint8_t y؛ // acht lijnen boven elkaar (در هر نمایش) uint16_t yl؛ // lijnnummer voor de MAX7219
برای (y = 0؛ y <8؛ y ++) {yl = (y+1) << 8؛ // شماره MAX7219 هفت پا در بالا 8 بیت ون 16 بیت وورد
SPI2_send64 ((yl | نمایش_بالایی [0] [y]) ، (yl | نمایش_بالایی [1] [y]) ، (yl | نمایش_بالایی [2] [y]) ، (yl | نمایش_بالایی [3] [y])) ؛
SPI1_send64 ((yl | نمایش_کمتر [0] [y]) ، (yl | نمایش_کمتر [1] [y]) ، (yl | نمایش_کمتر [2] [y]) ، (yl | نمایش_کمتر [3] [y])) ؛ }
}
void set_timebase (خالی)
{uint8_t timebase_knop؛
timebase_knop = LL_TIM_GetCounter (TIM4) / 2؛
سوئیچ (timebase_knop)
{case 0: LL_TIM_SetAutoReload (TIM3 ، 1999) ؛ زنگ تفريح؛ مورد 1: LL_TIM_SetAutoReload (TIM3 ، 999) ؛ زنگ تفريح؛ مورد 2: LL_TIM_SetAutoReload (TIM3 ، 499) ؛ زنگ تفريح؛ مورد 3: LL_TIM_SetAutoReload (TIM3 ، 199) ؛ زنگ تفريح؛ مورد 4: LL_TIM_SetAutoReload (TIM3 ، 99) ؛ زنگ تفريح؛ مورد 5: LL_TIM_SetAutoReload (TIM3 ، 49) ؛ زنگ تفريح؛ مورد 6: LL_TIM_SetAutoReload (TIM3 ، 19) ؛ زنگ تفريح؛ مورد 7: LL_TIM_SetAutoReload (TIM3 ، 9) ؛ زنگ تفريح؛ مورد 8: LL_TIM_SetAutoReload (TIM3 ، 4) ؛ زنگ تفريح؛ مورد 9: LL_TIM_SetAutoReload (TIM3 ، 1) ؛ زنگ تفريح؛
پیش فرض:
LL_TIM_SetAutoReload (TIM3 ، 99) ؛ زنگ تفريح؛ }}
void MAX7219_1_init ()
{SPI1_send64 (0x0000 ، 0x0000 ، 0x0000 ، 0x0000) ؛ // nop SPI1_send64 (0x0C00 ، 0x0C00 ، 0x0C00 ، 0x0C00) ؛ // خاموش کردن SPI1_send64 (0x0000 ، 0x0000 ، 0x0000 ، 0x0000) ؛ // nop SPI1_send64 (0x0F00 ، 0x0F00 ، 0x0F00 ، 0x0F00) ؛ // testmode off SPI1_send64 (0x0C01 ، 0x0C01 ، 0x0C01 ، 0x0C01) ؛ // خاموش شدن ، عملکرد عادی SPI1_send64 (0x0900 ، 0x0900 ، 0x0900 ، 0x0900) ؛ // بدون رمزگشایی 7 ثانیه ، 64 پیکسل SPI1_send64 (0x0A07 ، 0x0A07 ، 0x0A07 ، 0x0A07) ؛ // شدت 50٪ SPI1_send64 (0x0B07 ، 0x0B07 ، 0x0B07 ، 0x0B07) ؛ // همه سطرها روشن است}
void MAX7219_2_init ()
{SPI2_send64 (0x0000 ، 0x0000 ، 0x0000 ، 0x0000) ؛ // nop SPI2_send64 (0x0C00 ، 0x0C00 ، 0x0C00 ، 0x0C00) ؛ // خاموش کردن SPI2_send64 (0x0000 ، 0x0000 ، 0x0000 ، 0x0000) ؛ // nop SPI2_send64 (0x0F00 ، 0x0F00 ، 0x0F00 ، 0x0F00) ؛ // testmode off SPI2_send64 (0x0C01 ، 0x0C01 ، 0x0C01 ، 0x0C01) ؛ // خاموش کردن ، عملکرد عادی SPI2_send64 (0x0900 ، 0x0900 ، 0x0900 ، 0x0900) ؛ // بدون رمز 7 ثانیه ، 64 پیکسل SPI2_send64 (0x0A07 ، 0x0A07 ، 0x0A07 ، 0x0A07) ؛ // شدت 50٪ SPI2_send64 (0x0B07 ، 0x0B07 ، 0x0B07 ، 0x0B07) ؛ // همه سطرها روشن است}
uint16_t SPI1_send64 (uint16_t data3 ، uint16_t data2 ، uint16_t data1 ، uint16_t data0)
{LL_GPIO_ResetOutputPin (GPIOA ، LL_GPIO_PIN_4) ؛
LL_SPI_TransmitData16 (SPI1 ، data3) ؛
در حالی که (LL_SPI_IsActiveFlag_TXE (SPI1) == 0) {}
LL_SPI_TransmitData16 (SPI1 ، data2) ؛
در حالی که (LL_SPI_IsActiveFlag_TXE (SPI1) == 0) {}
LL_SPI_TransmitData16 (SPI1 ، data1) ؛
در حالی که (LL_SPI_IsActiveFlag_TXE (SPI1) == 0) {}
LL_SPI_TransmitData16 (SPI1 ، data0) ؛
در حالی که (LL_SPI_IsActiveFlag_BSY (SPI1) == 1) {}
LL_GPIO_SetOutputPin (GPIOA ، LL_GPIO_PIN_4) ؛
بازگشت LL_SPI_ReceiveData16 (SPI1) ؛ }
uint16_t SPI2_send64 (uint16_t data3 ، uint16_t data2 ، uint16_t data1 ، uint16_t data0)
{LL_GPIO_ResetOutputPin (GPIOB ، LL_GPIO_PIN_12) ؛
LL_SPI_TransmitData16 (SPI2 ، data3) ؛
در حالی که (LL_SPI_IsActiveFlag_TXE (SPI2) == 0) {}
LL_SPI_TransmitData16 (SPI2 ، data2) ؛
در حالی که (LL_SPI_IsActiveFlag_TXE (SPI2) == 0) {}
LL_SPI_TransmitData16 (SPI2 ، data1) ؛
در حالی که (LL_SPI_IsActiveFlag_TXE (SPI2) == 0) {}
LL_SPI_TransmitData16 (SPI2 ، data0) ؛
در حالی که (LL_SPI_IsActiveFlag_BSY (SPI2) == 1) {}
LL_GPIO_SetOutputPin (GPIOB ، LL_GPIO_PIN_12) ؛
بازگشت LL_SPI_ReceiveData16 (SPI2) ؛ }
خالی ADC1_2_IRQHandler (باطل)
{static uint8_t sample_counter؛ ماشه uint8_t ؛ static uint8_t previous_trigger؛
if (LL_ADC_IsActiveFlag_EOS (ADC1)! = RESET)
{if (sample_counter <32) {sample_buffer [sample_counter] = LL_ADC_REG_ReadConversionData32 (ADC1) / 256 ؛ if (sample_counter <32) sample_counter ++؛ else sample_counter = 0؛ } else {trigger = LL_ADC_REG_ReadConversionData32 (ADC1) / 256؛
if ((trigger == 7) && (previous_trigger <trigger)) // gaat niet helemaal goed bij blokgolven… {sample_counter = 0؛ } previous_trigger = ماشه؛ }
LL_GPIO_TogglePin (GPIOC ، LL_GPIO_PIN_13) ؛
LL_ADC_ClearFlag_EOS (ADC1) ؛
} }
خلاء استاتیک LL_Init (خالی)
{LL_APB2_GRP1_EnableClock (LL_APB2_GRP1_PERIPH_AFIO) ؛ LL_APB1_GRP1_EnableClock (LL_APB1_GRP1_PERIPH_PWR) ؛
NVIC_SetPriorityGrouping (NVIC_PRIORITYGROUP_4) ؛
NVIC_SetPriority (MemoryManagement_IRQn ، NVIC_EncodePriority (NVIC_GetPriorityGrouping () ، 0 ، 0)) ؛ NVIC_SetPriority (BusFault_IRQn ، NVIC_EncodePriority (NVIC_GetPriorityGrouping () ، 0 ، 0)) ؛ NVIC_SetPriority (UsageFault_IRQn ، NVIC_EncodePriority (NVIC_GetPriorityGrouping () ، 0 ، 0)) ؛ NVIC_SetPriority (SVCall_IRQn ، NVIC_EncodePriority (NVIC_GetPriorityGrouping () ، 0 ، 0)) ؛ NVIC_SetPriority (DebugMonitor_IRQn ، NVIC_EncodePriority (NVIC_GetPriorityGrouping () ، 0 ، 0)) ؛ NVIC_SetPriority (PendSV_IRQn ، NVIC_EncodePriority (NVIC_GetPriorityGrouping () ، 0 ، 0)) ؛ NVIC_SetPriority (SysTick_IRQn ، NVIC_EncodePriority (NVIC_GetPriorityGrouping () ، 0 ، 0)) ؛
LL_GPIO_AF_Remap_SWJ_NOJTAG ()؛
}
void SystemClock_Config (باطل)
{LL_FLASH_SetLatency (LL_FLASH_LATENCY_2) ؛ if (LL_FLASH_GetLatency ()! = LL_FLASH_LATENCY_2) Error_Handler ()؛ LL_RCC_HSE_Enable ()؛ در حالی که (LL_RCC_HSE_IsReady ()! = 1) ؛ LL_RCC_PLL_ConfigDomain_SYS (LL_RCC_PLLSOURCE_HSE_DIV_1 ، LL_RCC_PLL_MUL_9) ؛ LL_RCC_PLL_Enable ()؛ در حالی که (LL_RCC_PLL_IsReady ()! = 1) ؛ LL_RCC_SetAHBPrescaler (LL_RCC_SYSCLK_DIV_1) ؛ LL_RCC_SetAPB1Prescaler (LL_RCC_APB1_DIV_2) ؛ LL_RCC_SetAPB2Prescaler (LL_RCC_APB2_DIV_1) ؛ LL_RCC_SetSysClkSource (LL_RCC_SYS_CLKSOURCE_PLL) ؛ در حالی که (LL_RCC_GetSysClkSource ()! = LL_RCC_SYS_CLKSOURCE_STATUS_PLL) ؛ LL_Init1msTick (72000000) ؛ LL_SYSTICK_SetClkSource (LL_SYSTICK_CLKSOURCE_HCLK) ؛ LL_SetSystemCoreClock (72000000) ؛ LL_RCC_SetADCClockSource (LL_RCC_ADC_CLKSRC_PCLK2_DIV_6) ؛
NVIC_SetPriority (SysTick_IRQn ، NVIC_EncodePriority (NVIC_GetPriorityGrouping () ، 0 ، 0)) ؛
}
خلاء استاتیک MX_ADC1_Init (خالی)
{LL_ADC_InitTypeDef ADC_InitStruct ؛ LL_ADC_CommonInitTypeDef ADC_CommonInitStruct؛ LL_ADC_REG_InitTypeDef ADC_REG_InitStruct ؛ LL_GPIO_InitTypeDef GPIO_InitStruct ؛
LL_APB2_GRP1_EnableClock (LL_APB2_GRP1_PERIPH_ADC1) ؛
GPIO_InitStruct. Pin = LL_GPIO_PIN_0؛
GPIO_InitStruct. Mode = LL_GPIO_MODE_ANALOG ؛ LL_GPIO_Init (GPIOA ، & GPIO_InitStruct) ؛
NVIC_SetPriority (ADC1_2_IRQn ، NVIC_EncodePriority (NVIC_GetPriorityGrouping () ، 0 ، 0)) ؛
NVIC_EnableIRQ (ADC1_2_IRQn) ؛
ADC_InitStruct. DataAlignment = LL_ADC_DATA_ALIGN_RIGHT؛
ADC_InitStruct. SequencersScanMode = LL_ADC_SEQ_SCAN_DISABLE؛ LL_ADC_Init (ADC1 ، & ADC_InitStruct) ؛
ADC_CommonInitStruct. Multimode = LL_ADC_MULTI_INDEPENDENT؛
LL_ADC_CommonInit (_ LL_ADC_COMMON_INSTANCE (ADC1) ، & ADC_CommonInitStruct) ؛
ADC_REG_InitStruct. TriggerSource = LL_ADC_REG_TRIG_EXT_TIM3_TRGO؛
ADC_REG_InitStruct. SequencerLength = 1؛ ADC_REG_InitStruct. SequencerDiscont = LL_ADC_REG_SEQ_DISCONT_DISABLE؛ ADC_REG_InitStruct. ContinuousMode = LL_ADC_REG_CONV_SINGLE ؛ ADC_REG_InitStruct. DMAT انتقال = LL_ADC_REG_DMA_TRANSFER_NONE ؛ LL_ADC_REG_Init (ADC1 ، & ADC_REG_InitStruct) ؛
LL_ADC_SetChannelSamplingTime (ADC1 ، LL_ADC_CHANNEL_0 ، LL_ADC_SAMPLINGTIME_41CYCLES_5) ؛
}
خلاء استاتیک MX_SPI1_Init (خالی)
{LL_SPI_InitTypeDef SPI_InitStruct ؛ LL_GPIO_InitTypeDef GPIO_InitStruct ؛
LL_APB2_GRP1_EnableClock (LL_APB2_GRP1_PERIPH_SPI1) ؛
GPIO_InitStruct. Pin = LL_GPIO_PIN_5 | LL_GPIO_PIN_7 ؛
GPIO_InitStruct. Mode = LL_GPIO_MODE_ALTERNATE؛ GPIO_InitStruct. Speed = LL_GPIO_SPEED_FREQ_HIGH؛ GPIO_InitStruct. OutputType = LL_GPIO_OUTPUT_PUSHPULL ؛ LL_GPIO_Init (GPIOA ، & GPIO_InitStruct) ؛
// NVIC_SetPriority (SPI1_IRQn، NVIC_EncodePriority (NVIC_GetPriorityGrouping () ، 0 ، 0)) ؛
// NVIC_EnableIRQ (SPI1_IRQn) ؛
SPI_InitStruct. TransferDirection = LL_SPI_FULL_DUPLEX؛
SPI_InitStruct. Mode = LL_SPI_MODE_MASTER؛ SPI_InitStruct. DataWidth = LL_SPI_DATAWIDTH_16BIT؛ SPI_InitStruct. ClockPolarity = LL_SPI_POLARITY_LOW؛ SPI_InitStruct. ClockPhase = LL_SPI_PHASE_1EDGE؛ SPI_InitStruct. NSS = LL_SPI_NSS_SOFT ؛ SPI_InitStruct. BaudRate = LL_SPI_BAUDRATEPRESCALER_DIV8 ؛ SPI_InitStruct. BitOrder = LL_SPI_MSB_FIRST؛ SPI_InitStruct. CRCC محاسبه = LL_SPI_CRCCALCULATION_DISABLE ؛ SPI_InitStruct. CRCPoly = 10 ؛ LL_SPI_Init (SPI1 ، & SPI_InitStruct) ؛ }
خلاء استاتیک MX_SPI2_Init (خالی)
{LL_SPI_InitTypeDef SPI_InitStruct ؛ LL_GPIO_InitTypeDef GPIO_InitStruct ؛
LL_APB1_GRP1_EnableClock (LL_APB1_GRP1_PERIPH_SPI2) ؛
GPIO_InitStruct. Pin = LL_GPIO_PIN_13 | LL_GPIO_PIN_15 ؛
GPIO_InitStruct. Mode = LL_GPIO_MODE_ALTERNATE؛ GPIO_InitStruct. Speed = LL_GPIO_SPEED_FREQ_HIGH؛ GPIO_InitStruct. OutputType = LL_GPIO_OUTPUT_PUSHPULL ؛ LL_GPIO_Init (GPIOB ، & GPIO_InitStruct) ؛
// NVIC_SetPriority (SPI2_IRQn، NVIC_EncodePriority (NVIC_GetPriorityGrouping () ، 0 ، 0)) ؛
// NVIC_EnableIRQ (SPI2_IRQn) ؛
SPI_InitStruct. TransferDirection = LL_SPI_FULL_DUPLEX؛
SPI_InitStruct. Mode = LL_SPI_MODE_MASTER؛ SPI_InitStruct. DataWidth = LL_SPI_DATAWIDTH_16BIT؛ SPI_InitStruct. ClockPolarity = LL_SPI_POLARITY_LOW؛ SPI_InitStruct. ClockPhase = LL_SPI_PHASE_1EDGE؛ SPI_InitStruct. NSS = LL_SPI_NSS_SOFT ؛ SPI_InitStruct. BaudRate = LL_SPI_BAUDRATEPRESCALER_DIV4 ؛ SPI_InitStruct. BitOrder = LL_SPI_MSB_FIRST؛ SPI_InitStruct. CRCC محاسبه = LL_SPI_CRCCALCULATION_DISABLE؛ SPI_InitStruct. CRCPoly = 10 ؛ LL_SPI_Init (SPI2 ، & SPI_InitStruct) ؛ }
خلاء استاتیک MX_TIM3_Init (خالی)
{LL_TIM_InitTypeDef TIM_InitStruct ؛
LL_APB1_GRP1_EnableClock (LL_APB1_GRP1_PERIPH_TIM3) ؛
TIM_InitStruct. Prescaler = 229؛
TIM_InitStruct. CounterMode = LL_TIM_COUNTERMODE_UP ؛ TIM_InitStruct. Autoreload = 9 ؛ TIM_InitStruct. ClockDivision = LL_TIM_CLOCKDIVISION_DIV1 ؛ LL_TIM_Init (TIM3 ، & TIM_InitStruct) ؛
LL_TIM_DisableARRPreload (TIM3) ؛
LL_TIM_SetClockSource (TIM3 ، LL_TIM_CLOCKSOURCE_INTERNAL) ؛ LL_TIM_SetTriggerOutput (TIM3 ، LL_TIM_TRGO_UPDATE) ؛ LL_TIM_EnableMasterSlaveMode (TIM3) ؛ }
خلاء استاتیک MX_TIM4_Init (خالی)
{LL_TIM_InitTypeDef TIM_InitStruct ؛ LL_GPIO_InitTypeDef GPIO_InitStruct ؛
LL_APB1_GRP1_EnableClock (LL_APB1_GRP1_PERIPH_TIM4) ؛
GPIO_InitStruct. Pin = LL_GPIO_PIN_6 | LL_GPIO_PIN_7 ؛
GPIO_InitStruct. Mode = LL_GPIO_MODE_FLOATING؛ LL_GPIO_Init (GPIOB ، & GPIO_InitStruct) ؛
LL_TIM_SetEncoderMode (TIM4 ، LL_TIM_ENCODERMODE_X2_TI1) ؛
LL_TIM_IC_SetActiveInput (TIM4 ، LL_TIM_CHANNEL_CH1 ، LL_TIM_ACTIVEINPUT_DIRECTTI) ؛ LL_TIM_IC_SetPrescaler (TIM4 ، LL_TIM_CHANNEL_CH1 ، LL_TIM_ICPSC_DIV1) ؛ LL_TIM_IC_SetFilter (TIM4 ، LL_TIM_CHANNEL_CH1 ، LL_TIM_IC_FILTER_FDIV1) ؛ LL_TIM_IC_SetPolarity (TIM4 ، LL_TIM_CHANNEL_CH1 ، LL_TIM_IC_POLARITY_RISING) ؛ LL_TIM_IC_SetActiveInput (TIM4 ، LL_TIM_CHANNEL_CH2 ، LL_TIM_ACTIVEINPUT_DIRECTTI) ؛ LL_TIM_IC_SetPrescaler (TIM4 ، LL_TIM_CHANNEL_CH2 ، LL_TIM_ICPSC_DIV1) ؛ LL_TIM_IC_SetFilter (TIM4 ، LL_TIM_CHANNEL_CH2 ، LL_TIM_IC_FILTER_FDIV1) ؛ LL_TIM_IC_SetPolarity (TIM4 ، LL_TIM_CHANNEL_CH2 ، LL_TIM_IC_POLARITY_RISING) ؛
TIM_InitStruct. Prescaler = 0؛
TIM_InitStruct. CounterMode = LL_TIM_COUNTERMODE_UP ؛ TIM_InitStruct. Autoreload = 19 ؛ TIM_InitStruct. ClockDivision = LL_TIM_CLOCKDIVISION_DIV1 ؛ LL_TIM_Init (TIM4 ، & TIM_InitStruct) ؛
LL_TIM_DisableARRPreload (TIM4) ؛
LL_TIM_SetTriggerOutput (TIM4 ، LL_TIM_TRGO_RESET) ؛ LL_TIM_DisableMasterSlaveMode (TIM4) ؛ }
خلاء استاتیک MX_GPIO_Init (خالی)
{LL_GPIO_InitTypeDef GPIO_InitStruct ؛
LL_APB2_GRP1_EnableClock (LL_APB2_GRP1_PERIPH_GPIOC) ؛
LL_APB2_GRP1_EnableClock (LL_APB2_GRP1_PERIPH_GPIOD) ؛ LL_APB2_GRP1_EnableClock (LL_APB2_GRP1_PERIPH_GPIOA) ؛ LL_APB2_GRP1_EnableClock (LL_APB2_GRP1_PERIPH_GPIOB) ؛
LL_GPIO_SetOutputPin (GPIOC ، LL_GPIO_PIN_13) ؛
LL_GPIO_SetOutputPin (GPIOA ، LL_GPIO_PIN_4) ؛ LL_GPIO_SetOutputPin (GPIOB ، LL_GPIO_PIN_12) ؛
GPIO_InitStruct. Pin = LL_GPIO_PIN_13؛
GPIO_InitStruct. Mode = LL_GPIO_MODE_OUTPUT ؛ GPIO_InitStruct. Speed = LL_GPIO_SPEED_FREQ_LOW؛ GPIO_InitStruct. OutputType = LL_GPIO_OUTPUT_PUSHPULL ؛ LL_GPIO_Init (GPIOC ، & GPIO_InitStruct) ؛
GPIO_InitStruct. Pin = LL_GPIO_PIN_4؛
GPIO_InitStruct. Mode = LL_GPIO_MODE_OUTPUT ؛ GPIO_InitStruct. Speed = LL_GPIO_SPEED_FREQ_HIGH؛ GPIO_InitStruct. OutputType = LL_GPIO_OUTPUT_PUSHPULL ؛ LL_GPIO_Init (GPIOA ، & GPIO_InitStruct) ؛
GPIO_InitStruct. Pin = LL_GPIO_PIN_12؛
GPIO_InitStruct. Mode = LL_GPIO_MODE_OUTPUT ؛ GPIO_InitStruct. Speed = LL_GPIO_SPEED_FREQ_HIGH؛ GPIO_InitStruct. OutputType = LL_GPIO_OUTPUT_PUSHPULL ؛ LL_GPIO_Init (GPIOB ، & GPIO_InitStruct) ؛ }
void _Error_Handler (فایل char *، خط int)
{در حالی که (1) {}}
#ifdef USE_FULL_ASSERT
void assert_failed (فایل uint8_t* ، خط uint32_t)
{} #endif
توصیه شده:
هک چهار نفره بچه ها برای رانندگی خودکار ، پیگیری خط و تشخیص موانع خودرو: 4 مرحله
هک چهار نفره بچه ها در یک وسیله نقلیه خودران ، دنبال کردن خط و تشخیص موانع: در دستورالعمل امروز ما یک موتور 1000 واتی (بله من مقدار زیادی از آن را می دانم!) چهار نفره Electric Kid را به یک وسیله نقلیه خودران ، پیگیری خط و جلوگیری از موانع تبدیل می کنیم! ویدیوی نمایشی: https: //youtu.be/bVIsolkEP1k برای این پروژه به مواد زیر نیاز داریم
نحوه ایجاد چهار محاسبه کننده عملکردی در CPP: 6 مرحله
نحوه ایجاد چهار محاسبه کننده عملکردی در CPP: ماشین حسابها برای همه در زندگی روزمره استفاده می شوند. یک ماشین حساب ساده می تواند با استفاده از یک برنامه C ++ ساخته شود که بتواند دو عملوند وارد شده توسط کاربر را اضافه ، تفریق ، ضرب و تقسیم کند. دستور if و goto برای ایجاد ماشین حساب استفاده می شود
تبدیل Tonka Truck RC با Dump و 4WS چهار فرمان: 6 مرحله (همراه با تصاویر)
تبدیل Tonka Truck RC With Dump و 4WS Quad Steering: من اعتراف می کنم تبدیل کامیون Tonka RC ایده اصلی نیست ، اما وقتی به آن فکر کردم فکر کردم اولین نفر هستم … تا زمانی که در وب جستجو کردم ، D'oh. بله ، این قبلاً انجام شده است ، اما به نظر من بقیه به سختی این کار را انجام دادند و شکست خوردند
DIY MusiLED ، LED های هماهنگ موسیقی با یک کلیک Windows & Linux برنامه (32 بیتی و 64 بیتی). بازآفرینی آسان ، استفاده آسان ، حمل آسان: 3 مرحله
DIY MusiLED ، LED های هماهنگ موسیقی با یک کلیک Windows & Linux برنامه (32 بیتی و 64 بیتی). آسان برای ایجاد مجدد ، آسان برای استفاده ، آسان برای انتقال: این پروژه به شما کمک می کند تا 18 LED (6 قرمز + 6 آبی + 6 زرد) را به برد Arduino خود متصل کرده و سیگنال های زمان واقعی کارت صدا رایانه خود را تجزیه و تحلیل کرده و آنها را به چراغ های LED برای روشن کردن آنها مطابق با جلوه های ضرب (Snare ، High Hat ، Kick)
نحوه ساخت یک فیلم با صفحه تقسیم شده با چهار مرحله: 4 مرحله (همراه با تصاویر)
چگونه می توان با چهار مرحله ویدئویی با صفحه نمایش تقسیم کرد: ما اغلب می بینیم که یک نفر در صحنه ای دو بار در یک نمایش تلویزیونی نشان می دهد. و تا آنجا که ما می دانیم ، این بازیگر برادر دوقلو ندارد. ما همچنین مشاهده کرده ایم که دو ویدئوی آواز بر روی یک صفحه نمایش داده می شود تا مهارت های خوانندگی آنها مقایسه شود. این قدرت spl است