Złącze AO (Analog Output) daje sygnał możliwy do odczytania przez ADC

Obojętnie, czy będzie to

  1. Czujnik dźwięku
  2. Żyroskop
  3. Czujnik gazu
  4. Inny czujnik ze złączem AO

– zawsze można skorzystać z analogowego odczytu wartości czujnika przez złącze ADC.

Piny

Czujnik <—> STM32
+ (VCC) <—> 3,3V (chyba, że czujnik nie pracuje na 3,3V – wg instrukcji producenta – wówczas zapewne 5V)
G (GND) <—> GND
AO <—> A0 (piny analogiczne do Arduino)

Przy czujniku dźwięku:
Czujnik dźwięku

Przy żyroskopie, identyczne podłączenie:
Czujnik dźwięku

My w naszym przykładzie użyjemy czujnika dźwięku (z linku powyżej). Odczytujemy dźwięk podobnie jak w przypadku sygnału WAV – mamy sinusoidalny przebieg dźwięku. Przetwornik ma zakres 12 bit: 0-4095. Zero sinusoidy jest w przedziale około 2200 (powinno być teoretycznie około 2048, przesunięcie zera wyżej tzw. DC Offset).

STM32 CubeMX

Wykorzystamy złącze A0 z naszego STM32F103RB – czyli złącze odpowiadające najczęściej wykorzystywanemu złączu Arduino.
W nowym projekcie podpinamy: PA0 -> ADC1_IN0 do kanału nr 0.

Zapisujemy, ustawiamy też zegar (u mnie wystąpił konflikt z taktowaniem ADC, klikamy RESOLVE Clock Issues, teraz ADC ma taktowanie 8Mhz) generujemy kod.

1
2
3
4
5
6
7
8
9
10
11
12
/* USER CODE BEGIN 2 */
HAL_ADC_Start(&hadc1); //włącz odczyt hadc1
/* USER CODE END 2 */

//w pętli while(1)
/*USER CODE BEGIN 3 */
if(HAL_ADC_PollForConversion(&hadc1,10) == HAL_OK) //timeout:10
{
pomiarADC = HAL_ADC_GetValue(&hadc1);
HAL_ADC_Start(&hadc1);
if (pomiarADC<2250 || pomiarADC>2390) //for sound
// if (pomiarADC > 10 && pomiarADC <4000) //for gyroscope instead of sound { rt_kprintf("%i,", pomiarADC); HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin, GPIO_PIN_SET); } else HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin, GPIO_PIN_RESET); /* USER CODE END 3 */

Oczywiście problem nie jest optymalny – nie korzysta ani z timera do równego odczytu, ani z DMA, ale tym zajmiemy się później. if – eliminuje niepotrzebny szum informacyjny (zera sinusa), teraz nasz czujnik wypisuje liczby na konsoli jeśli wychodzi ze strefy ciszy. Dla żyroskopu „cisza” jest adekwatna do poziomu 0 lub >4000 (położenia krańcowe), przy przemieszczaniu wypisuje pośrednie liczby, mruga też dioda wbudowana w układ.

 

 

C, STM32