Електронна хлебарка на STM32 от импровизирани средства (видео), Частно мнение
Mosgortrans промени условията за билети за пътуване. Нека да разберем как да спестим пари.
Няколко правила за предоставяне на услуги, които много хора забравят
Безконтактната цифра заменя железните бутони
Невидимо компютрите започнаха да контролират вашите права
Хърватия: Воднян
Как да развъждате риба ангел у дома?
Как да уволните служител съгласно закона?
Скрити клаузи от устното споразумение с работодателя
Тест: за какво растение става въпрос?
Стартиращо финансиране
Сергей Трофимов
Луц Винклер
Сергей Трофимов
Няма кварц, не е необходим за работа на ADC. Има превключвател и кондензатори за потискане на шума. Както се оказа по-късно, не беше напразно. Микромоторът създава много силни смущения в захранването, но веригата все още работи. Имаше идея за свързване на бутон за избор на режими и допълнителен светодиод за индикация в долната част на диаграмата, но не го използвах в крайната версия. SWD конекторът се използва за програмиране. Не проверих двигателя за консумация, но като си спомня, че двигателите по дефиниция не могат да ядат малко, веднага го захранвах през транзистора W1P, от които има огромен брой на старата дънна платка, а запояването на SMD транзистори с пистолет за запояване е изключително просто. Успоредно с двигателя инсталирах диод, който е необходим за защита на транзистора от повреда, когато двигателят спре. Схемата и платката са проектирани в програмата Eagle.
Платката беше направена едностранна, но все пак трябваше да сложа два проводника отгоре.
На STM32, дори в контролерите от начално ниво STM32F030F4, в които има само 16 килобайта памет, има 12-битов аналогово-цифров преобразувател за 11 канала. Въпреки че самият конвертор е само един, е възможно да се четат аналогови данниот 11 пина на контролера и ги преобразувайте в цифров сигнал. Единственото нещо, което трябва да запомните е, че контролерът има само 20 крака в този случай, така че ние ги използваме или за изход, или за вход. В моя случай използвах крака PA1 - за входни данни от микрофона, PA9 и PA10 за включване на светодиодите - ляво и дясно "око", PA6 за включване на мотора.
12-битов конвертор означава, че на входа получаваме цифрови стойности от 0 до 4095, които могат да бъдат проследени в програмата. „Издърпах“ PA1 до захранване чрез външен 10 килоомов резистор, което ми даде стабилна стойност от 4095 в случай, че изобщо нямаше звук на микрофона. Ако се опитате да включите преобразувателя на крака без издърпване, тогава стойностите произволно ще танцуват в широк диапазон, в моя случай беше от 1000 до 2500. Микрофон, свързан по прост начин, създава малък, но достатъчен спад на напрежението за наблюдение. В моя случай под 4056 за доста силни звуци. Това показва, че чувствителността на такава схема е много ниска и е по-добре да се сложи усилвател, но за обикновен датчик за силен удар това е напълно достатъчно.
За да стартирате ADC на STM32, трябва програмно да направите следното: 1.Конфигурирайте краката за I/O 2. Разрешете тактоване на ADC 3. Калибрирайте ADC 4. Активирайте ADC 5. Задаване на ADC конфигурация 6. Правете измервания (или четете данни, ако измерванията се правят непрекъснато)
GPIO конфигурация за всички желани пинове
__INLINE void ConfigureGPIO(void) /* (1) Активиране на периферния часовник на GPIOA */ /* (2) Изберете изходен режим (01) на GPIOA */ RCC->AHBENR = RCC_AHBENR_GPIOAEN; /* активиране на тактова честота за GPIOA */ GPIOA->MODER = (GPIOA->MODER &
(GPIO_MODER_MODER1GPIO_MODER_MODER10GPIO_MODER_MODER9GPIO_MODER_MODER5 GPIO_MODER_MODER6)) \ (GPIO_MODER_MODER1_0GPIO_MODER_MODER10_0GPIO_MODER_MODER9_0 GPIO_MODER_MODER5_0GPIO_ MODER_MODER6_0); /* активиране на изходен режим за всичко */ >
Използван вътрешен кристал __INLINE void SetClockForADC(void) /* (1) Активиране на периферния часовник на ADC */ /* (2) Стартиране на HSI14 RC осцилатор */ /* (3) Изчакайте HSI14 да е готов */ RCC->APB2ENR = RCC_APB2ENR_ADC1EN; /* (1) */ RCC->CR2 = RCC_CR2_HSI14ON; /* (2) */ while ((RCC->CR2 & RCC_CR2_HSI14RDY) == 0) /* (3) */ /* За стабилна реализация добавете тук управление на изчакване */ > > Калибриране
__INLINE void CalibrateADC(void) /* (1) Уверете се, че ADEN = 0 */ /* (2) Изчистете ADEN */ /* (3) Стартирайте калибрирането, като зададете ADCAL */ /* (4) Изчакайте, докато ADCAL=0 */ if ((ADC1->CR & ADC_CR_ADEN) != 0) /* (1) */ A DC1->CR &= (uint32_t)(
ADC_CR_ADEN); /* (2) */ > ADC1->CR=ADC_CR_ADCAL; /* (3) */ while ((ADC1->CR & ADC_CR_ADCAL) != 0) /* (4) */ /* За стабилно внедряване добавете тук управление на изчакване */ > __NOP();__NOP(); /* Тези 2 NOP трябва да осигурят 2 ADC цикъла преди задаване на бит ADEN */ > Разрешете инвертора
__INLINE void EnableADC(void) /* (1) Активиране на ADC */ /* (2) Изчакайте, докато ADC е готов */ ADC1->CR = ADC_CR_ADEN; /* (1) */ while ((ADC1->ISR & ADC_ISR_ADRDY) == 0) /* (2) */ /* За стабилно внедряване добавете тук управление на изчакване */ > > Активирайте само онези канали, които са необходими
__INLINE void ConfigureADC(void) /* (1) Изберете HSI14, като напишете 00 в CKMODE (нулиране на стойност) */ /* (2)Изберете режим на автоматично изключване */ /* (3) Изберете CHSEL01 */ /* (4) Изберете режим на вземане на проби от 111 т.е. 239.5 ADC clk да бъде по-голям от 17.1us */
ADC_CFGR2_CKMODE; /* (1) */ ADC1->CFGR1 = ADC_CFGR1_AUTOFF; /* (2) */ ADC1->CHSELR = ADC_CHSELR_CHSEL1; /* (3) */ ADC1->SMPR = ADC_SMPR1_SMPR_0 ADC_SMPR1_SMPR_1 ADC_SMPR1_SMPR_2; /* (4) */
Сега основният цикъл, в който четем данните и реагираме на тях
while (1) /* Цикъл, докато мярката е в диапазона */ //delay_ms(10); /* Извършва AD конвергенцията */ ADC1->CR = ADC_CR_ADSTART; /* стартира ADC преобразуването */ while ((ADC1->ISR & ADC_ISR_EOC) == 0); /* изчакайте края на преобразуването */ val = ADC1->DR; // получени данни от ADC
if (val GPIOA->BSRR = (1 GPIOA->BSRR = (1 GPIOA->BSRR = (1 delay_ms(500); // изчакайте половин секунда, нека GPIOA->BRR = (1 GPIOA->BRR = (1 GPIOA->BRR = (1 delay_ms) (200) ); // изчакайте малко, тъй като звукът от мотора отново активира микрофона
Освен това, ако двигателят не работи, периодично намигвайте с очите си
SysTick_Config(48000);/* 1ms конфигурация */
void SysTick_Handler(void) статичен uint32_t long_counter = LONG_DELAY; статичен uint32_t short_counter = SHORT_DELAY; статичен uint16_t error_temp = 0;
if (long_counter– == 0) if(error == 0) /* следната инструкция може да се използва само ако никой ISR не променя GPIOC ODR или чрез директно записване, или чрез използване на GPIOC BSRR или BRR в противен случай трябва да се приложи механизъм за превключване с помощта на GPIOC BSRR и/или BRR */ //GPIOC->ODR ^= (1 BSRR = (1 BSRR = (1 0) if (short_counter– == 0) //GPIOC->ODR ^= (1 ODR ^= (1 превключващ светодиод на PA10 GPIOA->ODR ^= (1 превключващ светодиод на PA9
къс_брояч =SHORT_DELAY; грешка_temp–; > > >
Източниците на борда на Eagle могат да бъдат изтеглени тук>>>
Пълният изходен проект на CooCox е тук>>>