সুচিপত্র:
ভিডিও: চার বিট অসিলোস্কোপ: 6 টি ধাপ
2024 লেখক: John Day | [email protected]. সর্বশেষ পরিবর্তিত: 2024-01-30 08:01
এটি একটি মজাদার প্রজেক্ট মাত্র এটা দেখার জন্য যে আমি MAX7219 ডট ম্যাট্রিক্স ডিসপ্লে কতটা গতিতে ধাক্কা দিতে পারি। এবং এটি "জীবনের খেলা" চালানোর পরিবর্তে, আমি এটি দিয়ে একটি "সুযোগ" করার সিদ্ধান্ত নিয়েছি। আপনি শিরোনাম থেকে বুঝতে পারবেন, এটি একটি বাস্তব অসিলোস্কোপের প্রতিস্থাপন নয়:-)।
যেহেতু আমি এটিকে কোন গুরুতর উপায়ে ব্যবহার করার পরিকল্পনা করি না, আমি এর জন্য একটি মুদ্রিত সার্কিট বোর্ড তৈরি করব না। হয়তো, আমি হয়তো এটি একটি পারফ বোর্ডে রাখব কিন্তু আপাতত এটি একটি রুটিবোর্ডে আছে এবং থাকবে। এছাড়াও কোন ইনপুট এম্প্লিফায়ার/এটেনুয়েটর নেই, আপনাকে 0 থেকে 3.3V এর মধ্যে একটি সিগন্যাল সরবরাহ করতে হবে, নেতিবাচক বা 3.3V এর উপরে যাবেন না কারণ আপনি মাইক্রোকন্ট্রোলারের ক্ষতি করতে পারেন।
ধাপ 1: হার্ডওয়্যার
যখন আপনি ইবে বা অনুরূপ সাইটের মাধ্যমে চীনে যন্ত্রাংশ কিনবেন তখন এটি সস্তা, খুব সস্তা। এটি একটি STM32F103C8 ডেভেলপমেন্ট বোর্ড ব্যবহার করে, যাকে কখনও কখনও একটি "নীল পিল" বলা হয় যা আমি প্রায় 2 ইউরো (বা ইউএসডি) কিনেছি, এটি প্রায় একই মান, 2018 এর শেষ), দুটি 8x8x4 ডট-ম্যাট্রিক্স ডিসপ্লে যার উপর MAX7219 চিপস, কেনা হয়েছিল 5 ইউরো একটি টুকরা এবং প্রায় 1 ইউরোর একটি ঘূর্ণমান এনকোডার।
অবশ্যই একশো মিলিঅ্যাম্পে 3.3V সরবরাহকারী বিদ্যুৎ সরবরাহ প্রয়োজন। STM32F103C8 ডেভেলপমেন্ট বোর্ডে ভোল্টেজ রেগুলেটর ব্যবহার করা হয় না, এটি ডিসপ্লের জন্য পর্যাপ্ত কারেন্ট প্রদান করতে পারে না। MAX7219 এর জন্য ডেটশীট নির্দিষ্ট করে যে অপারেটিং সাপ্লাই ভোল্টেজ 4.0 এবং 5.5V এর মধ্যে হওয়া উচিত কিন্তু এটি 3.3V এ ঠিকঠাক চলে, সম্ভবত যখন আপনি এটি খুব গরম বা ঠান্ডা পরিবেশে ব্যবহার করবেন না, কিন্তু 20 সেলসিয়াসে এটি ঠিক আছে। এবং এখন মাইক্রোকন্ট্রোলার এবং ডিসপ্লেবোর্ডের মধ্যে লেভেল-কনভার্টার ব্যবহার করতে হবে না।
ধাপ 2: নির্মাণ
যখন আপনি ছবিটি দেখবেন তখন আপনি দেখতে পাচ্ছেন যে আমি রুটিবোর্ডে বিদ্যুৎ লাইনগুলি একটি প্রচলিত পদ্ধতিতে ব্যবহার করি, উপরের দুটি লাইনই ইতিবাচক রেল এবং নীচের উভয়টিই স্থল রেল। এটি যেভাবে আমি এটি করতে অভ্যস্ত এবং এটি ভাল কাজ করে, এটি সেটআপটিকে আমার আঁকা স্কিম্যাটিক্সের মতো কিছুটা বেশি করে তোলে। এছাড়াও, আমি অনেকগুলি ছোট ছোট বোর্ড তৈরি করেছি যার অংশগুলি আমি রুটিবোর্ডে প্লাগ করে জিনিসগুলিকে গতিশীল করতে পারি এবং সেগুলি দুটি শীর্ষ লাইনকে ইতিবাচক এবং নিম্ন লাইনগুলিকে স্থল হিসাবে ব্যবহার করার জন্য কনফিগার করা হয়েছে। যেমনটি আমি বলেছি, রেজোলিউশনটি 4 বিট (16 স্তর), এবং যেহেতু 4x8 লেড একে অপরের পাশে রয়েছে সেখানে কেবল 32 টি নমুনা পয়েন্ট (পয়েন্ট) রয়েছে। একটি Rigol Rigol DS1054Z (8 বিট এবং 12Mpts) এর সাথে তুলনা করুন এবং আপনি দেখতে পাবেন যে এটি খুব কমই একটি খেলনা। প্রকৃত ব্যান্ডউইথ কি, আমি জানি না, আমি এটি 10kHz পর্যন্ত পরীক্ষা করেছি এবং এটি সূক্ষ্ম কাজ করে।
ধাপ 3: প্রোগ্রাম
আমি যে IDE ব্যবহার করি তা হল Atollic TrueStudio যা এই বছরের শুরুতে (2018) ST মাইক্রো ইলেকট্রনিক্স দ্বারা গৃহীত হয়েছিল এবং বিনামূল্যে পাওয়া যায়, কোন সময় সীমা নেই, কোন কোড সাইজ সীমা নেই, কোন নাগ-স্ক্রিন নেই। এর সাথে একসাথে, আমি STM32CubeMX ব্যবহার করি, একটি প্রোগ্রাম যা আমাকে প্রারম্ভিক কোড সরবরাহ করে এবং সমস্ত পেরিফেরালগুলির সূচনা তৈরি করে। এবং এতে মাইক্রোকন্ট্রোলারের সমস্ত পিনের ডিসপ্লে এবং তাদের ব্যবহার রয়েছে। এমনকি যদি আপনি কোড জেনারেট করার জন্য STM32CubeMX ব্যবহার না করেন, এটি খুবই সহজ। একটি জিনিস যা আমি পছন্দ করি না তা হল তথাকথিত HAL যা STM32CubeMX এর ডিফল্ট। আমি কাজ করার লো লেয়ার পদ্ধতি পছন্দ করি।
মাইক্রোকন্ট্রোলার প্রোগ্রাম করার জন্য আমি ST মাইক্রো ইলেকট্রনিক্স থেকে ST-Link প্রোগ্রামার/ডিবাগার অথবা সেগার দ্বারা তৈরি J-Link ব্যবহার করি। এই দুটি ডিভাইসই বিনামূল্যে নয়, যদিও আপনি কয়েক ইউরোর বিনিময়ে তাদের চীনা কপি কিনতে পারেন।
ধাপ 4: কোড সম্পর্কে
MAX7219 এর ঠিকানা LEDs যাকে আমি একটি অনুভূমিক ফ্যাশন বলি, একে অপরের পাশে 8 টি LED। একটি অসিলোস্কোপের জন্য 8 টি LED একে অপরের উপরে থাকা সহজ হবে, তাই আমি একটি সাধারণ ফ্রেম-বাফার তৈরি করেছি যা একটি উল্লম্ব উপায়ে ডেটা দিয়ে লেখা হয় এবং প্রয়োজনীয় অনুভূমিক উপায়ে পড়ে। MAX7219 প্রতি 8 এলইডি -তে 16 বিট কোড ব্যবহার করে, যেখানে প্রথম বাইটটি নির্বাচিত লাইনকে সম্বোধন করতে ব্যবহৃত হয়। এবং যেহেতু এই চারটি মডিউল একে অপরের পাশে স্ট্যাক করা আছে, তাদের ইনপুটগুলি মডিউলের আউটপুটগুলির সাথে সংযুক্ত হওয়ার আগে, আপনাকে শেষ মডিউলে পৌঁছানোর জন্য সেই 16 বিটগুলি চারবার পাঠাতে হবে। (আমি আশা করি আমি বিষয়গুলো পরিষ্কার করছি …) SPI ব্যবহার করে MAX7219 এ ডেটা পাঠানো হচ্ছে, একটি সহজ কিন্তু খুব দ্রুত প্রোটোকল। আমি এই নিয়েই পরীক্ষা -নিরীক্ষা করছিলাম, MAX7219 এ ডেটা পাঠাতে আপনি কত দ্রুত যেতে পারেন। শেষ পর্যন্ত, আমি ডেটশীট দ্বারা নির্ধারিত সর্বোচ্চ গতির ঠিক 9 মেগাহার্টজে ফিরে গেলাম।
আমি STM32F103C8 এর চারটি উপলব্ধ টাইমারের মধ্যে দুটি ব্যবহার করি, একটি টাইমবেজ প্রজন্মের জন্য এবং অন্যটি রোটারি এনকোডার পড়ার জন্য, যা টাইমবেস সেট করে। TIMER3 টাইমবেস জেনারেট করে, এটি ঘড়িটি 230 দ্বারা ভাগ করে, প্রতি 3.2 ইউএসের কাউন্টার আপডেট করে। ঘূর্ণমান এনকোডার জাদুকরী আপনি 2 ঘড়ি ডাল থেকে 2000 ঘড়ি ডাল পর্যন্ত কাউন্টার গণনা করতে নির্বাচন করতে পারেন। ধরুন আপনি 100 টি বেছে নিন। TIMER3 তারপর প্রতি 320 ইউএস একটি ইভেন্ট তৈরি করে। এই ইভেন্টটি ADC কে ইনপুট সিগন্যালের একটি নমুনা রেকর্ড করার জন্য ট্রিগার করে, এবং একটি স্ক্রিনফুলের জন্য 32 টি নমুনা হিসাবে, এটি প্রায় পরে সম্পন্ন হবে। 10 এমএস 10mS এ আপনি 100 Hz এর একটি তরঙ্গদৈর্ঘ্য, অথবা 200 Hz এর দুটি, এবং আরও অনেক কিছু করতে পারেন। প্রতি পর্দায় waves টি তরঙ্গের উপর দিয়ে যাওয়া যদিও তরঙ্গাকৃতিকে চিনতে বরং কঠিন করে তোলে।
বাকিদের জন্য, আমি কেবল আপনাকে কোডটি উল্লেখ করতে পারি, আপনার যদি আরডুইনো নিয়ে কিছু অভিজ্ঞতা থাকে তবেও এটি অনুসরণ করা কঠিন নয়। আসলে, আপনি একটি Arduino দিয়ে একই জিনিস তৈরি করতে পারেন, যদিও আমি সন্দেহ করি যে এটি একটি "নীল বড়ি" হিসাবে দ্রুত কাজ করবে। STM32F103C8 একটি 32 বিট মাইক্রোকন্ট্রোলার যা 72 MHz এ চলছে, এতে দুটি 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" #clud_stll.h "#clud_sll_x" #clud_sll_x "#clud_st_hll #stlud32.st" "stm32f1xx_ll_dma.h" অন্তর্ভুক্ত করুন
#ifndef NVIC_PRIORITYGROUP_0
# define NVIC_PRIORITYGROUP_0 ((uint32_t) 0x00000007) # define NVIC_PRIORITYGROUP_1 ((uint32_t) 0x00000006) # define NVIC_PRIORITYGROUP_2 ((uint32_t) 0x00000005) # define NVIC_PRIORITYGROUP_3 ((uint32_t) 0x00000004) # define NVIC_PRIORITYGROUP_4 ((uint32_t) 0x00000003) #endif
#ifdef _cplusplus
বাহ্যিক "C" {#endif void _Error_Handler (char *, int);
#ত্রুটি_হ্যান্ডলার () _ ত্রুটি_হ্যান্ডলার (_ ফাইল_, _LINE_)
#ifdef _cplusplus} #endif
#যদি শেষ
ধাপ 6: Main.c
#অন্তর্ভুক্ত "main.h" স্ট্যাটিক অকার্যকর LL_Init (অকার্যকর); অকার্যকর 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); অকার্যকর MAX7219_1_init (); অকার্যকর MAX7219_2_init (); অকার্যকর erase_frame_buffer (অকার্যকর); void fill_frame_buffer (অকার্যকর); void display_frame_buffer (অকার্যকর); অকার্যকর set_timebase (অকার্যকর);
uint8_t আপার_ডিসপ্লে [4] [8]; // ভিয়ার বাইট নাষ্ট এলকার, আচট ওন্ডার এলকার
uint8_t low_display [4] [8]; // deze twee samen vormen de frame-buffer
uint8_t নমুনা_ বাফার [32]; // বাফার ভুর ডি রেজাল্টেন ভ্যান ডি এডিসি
int প্রধান (শূন্য)
{LL_Init (); SystemClock_Config (); MX_GPIO_Init (); MX_ADC1_Init (); MX_SPI1_Init (); MX_SPI2_Init (); MX_TIM3_Init (); MX_TIM4_Init ();
LL_SPI_Enable (SPI1);
LL_SPI_Enable (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 (); }}
অকার্যকর erase_frame_buffer (অকার্যকর)
{int8_t x; int8_t y;
জন্য (x = 0; x <4; x ++) // kolom_bytes {
জন্য (y = 0; y <8; y ++) // lijnen {upper_display [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; // steeds 8 বিট naast elkaar en dat 4 maal op een lijn 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 << display_bit); } else // নিম্ন প্রদর্শন schrijven {lower_display [display_byte] [7-y] | = (1 << display_bit); }}}
void display_frame_buffer (অকার্যকর)
{
uint8_t y; // acht lijnen boven elkaar (প্রতি ডিসপ্লে) uint16_t yl; // lijnnummer voor de MAX7219
জন্য (y = 0; y <8; y ++) {yl = (y+1) << 8; // MAX7219 heeft lijnnummer de উপরের 8 bits van 16 bits woord
SPI2_send64 {;
SPI1_send64 ((yl | lower_display [0] [y]), (yl | lower_display [1] [y]), (yl | lower_display [2] [y]), (yl | lower_display [3] [y])); }
}
অকার্যকর set_timebase (অকার্যকর)
{uint8_t timebase_knop;
timebase_knop = LL_TIM_GetCounter (TIM4) / 2;
সুইচ (timebase_knop)
{কেস 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); বিরতি; }}
অকার্যকর 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); // SPI1_send64 (0x0C01, 0x0C01, 0x0C01, 0x0C01) বন্ধ টেস্টমোড; // শাটডাউন বন্ধ, স্বাভাবিক অপারেশন SPI1_send64 (0x0900, 0x0900, 0x0900, 0x0900); // না 7seg ডিকোড, 64 পিক্সেল SPI1_send64 (0x0A07, 0x0A07, 0x0A07, 0x0A07); // তীব্রতা 50% SPI1_send64 (0x0B07, 0x0B07, 0x0B07, 0x0B07); // সব সারি চালু আছে}
অকার্যকর 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); // SPI2_send64 (0x0C01, 0x0C01, 0x0C01, 0x0C01) বন্ধ টেস্টমোড; // শাটডাউন বন্ধ, স্বাভাবিক অপারেশন SPI2_send64 (0x0900, 0x0900, 0x0900, 0x0900); // না 7seg ডিকোড, 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 (অকার্যকর)
{স্ট্যাটিক uint8_t sample_counter; uint8_t ট্রিগার; স্ট্যাটিক uint8_t previous_trigger;
যদি (LL_ADC_IsActiveFlag_EOS (ADC1)! = RESET)
{যদি (sample_counter <32) {sample_buffer [sample_counter] = LL_ADC_REG_ReadConversionData32 (ADC1) / 256; যদি (sample_counter <32) sample_counter ++; অন্যথায় sample_counter = 0; } অন্যথায় {trigger = LL_ADC_REG_ReadConversionData32 (ADC1) / 256;
যদি ((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 ();
}
অকার্যকর SystemClock_Config (অকার্যকর)
{LL_FLASH_SetLatency (LL_FLASH_LATENCY_2); যদি (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_SetAPB1 প্রেসকেলার (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. DMATransfer = 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. CRCCalculation = 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. CRCCalculation = 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 *file, int line)
{while (1) {}}
#ifdef USE_FULL_ASSERT
অকার্যকর assert_failed (uint8_t* ফাইল, uint32_t লাইন)
{ } #যদি শেষ
প্রস্তাবিত:
কিভাবে মোটো ব্যবহার করে সার্ভো মোটর চালানো যায়: মাইক্রো দিয়ে বিট: বিট: 7 টি ধাপ (ছবি সহ)
কিভাবে মোটো ব্যবহার করে সার্ভো মোটর চালানো যায়: বিট মাইক্রো: বিট: মাইক্রো: বিট এর কার্যকারিতা বাড়ানোর একটি উপায় হল স্পার্কফুন ইলেকট্রনিক্সের মোটো: বিট নামে একটি বোর্ড ব্যবহার করা (প্রায় $ 15-20)। এটি জটিল দেখায় এবং এর অনেক বৈশিষ্ট্য রয়েছে, তবে এটি থেকে সার্ভো মোটর চালানো কঠিন নয়। মোটো: বিট আপনাকে অনুমতি দেয়
রাস্পবেরি পাই MMA8452Q 3-অক্ষ 12-বিট/8-বিট ডিজিটাল অ্যাকসিলরোমিটার পাইথন টিউটোরিয়াল: 4 ধাপ
Raspberry Pi MMA8452Q 3-Axis 12-bit/8-bit Digital Accelerometer Python Tutorial: MMA8452Q হল একটি স্মার্ট, লো-পাওয়ার, তিন-অক্ষ, ক্যাপাসিটিভ, 12 বিট রেজোলিউশনের মাইক্রো-মেশিন অ্যাকসিলরোমিটার। নমনীয় ব্যবহারকারী প্রোগ্রামযোগ্য বিকল্পগুলি অ্যাক্সিলরোমিটারে এম্বেডেড ফাংশনগুলির সাহায্যে সরবরাহ করা হয়, দুটি বাধায় কনফিগারযোগ্য
একটি মাইক্রো প্রোগ্রামিং: বিট রোবট এবং জয়স্টিক: মাইক্রো পাইথন সহ বিট কন্ট্রোলার: 11 টি ধাপ
একটি মাইক্রো প্রোগ্রামিং: বিট রোবট এবং জয়স্টিক: মাইক্রোপাইথন সহ বিট কন্ট্রোলার: রোবোক্যাম্প ২০১ For-এর জন্য, আমাদের গ্রীষ্মকালীন রোবটিক্স ক্যাম্প, ১০-১ aged বছর বয়সী তরুণরা বিবিসি মাইক্রো: বিট ভিত্তিক 'অ্যান্টওয়েট রোবট', পাশাপাশি প্রোগ্রামিং একটি মাইক্রো: বিট একটি রিমোট কন্ট্রোল হিসাবে ব্যবহার করতে। যদি আপনি বর্তমানে রোবোক্যাম্পে থাকেন, স্কি
রাস্পবেরি পাই MMA8452Q 3-অক্ষ 12-বিট/8-বিট ডিজিটাল অ্যাকসিলরোমিটার জাভা টিউটোরিয়াল: 4 ধাপ
Raspberry Pi MMA8452Q 3-Axis 12-bit/8-bit Digital Accelerometer Java Tutorial: MMA8452Q হল একটি স্মার্ট, লো-পাওয়ার, থ্রি-অক্ষ, ক্যাপাসিটিভ, মাইক্রো-মেশিন অ্যাকসিলরোমিটার যার রেজুলেশন 12 বিট। নমনীয় ব্যবহারকারী প্রোগ্রামযোগ্য বিকল্পগুলি অ্যাক্সিলরোমিটারে এম্বেডেড ফাংশনগুলির সাহায্যে সরবরাহ করা হয়, দুটি বাধায় কনফিগারযোগ্য
Pimoroni Enviro দিয়ে হালকা এবং রঙ পরিমাপ: মাইক্রো জন্য বিট: বিট: 5 টি ধাপ
পিমোরোনি এনভিরো দিয়ে হালকা এবং রঙ পরিমাপ: মাইক্রো জন্য বিট: বিট: আমি এমন কিছু ডিভাইসে কাজ করছিলাম যা পূর্বে আলো এবং রঙ পরিমাপের অনুমতি দেয় এবং আপনি এই ধরনের পরিমাপের পিছনে তত্ত্ব সম্পর্কে অনেক কিছু খুঁজে পেতে পারেন নির্দেশিকা এখানে এবং এখানে। সম্প্রতি এনভিরো প্রকাশ করেছে: বিট, এম এর জন্য একটি অ্যাড-অন