This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| en:iot-open:introductiontoembeddedprogramming2:cppfundamentals:analog_io [2023/11/17 16:35] – pczekalski | en:iot-open:introductiontoembeddedprogramming2:cppfundamentals:analog_io [2023/11/23 12:21] (current) – pczekalski | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| + | ====== Manipulating analogue signals ====== | ||
| + | {{: | ||
| + | The analogue inputs and outputs are used when the signal can take a range of values, unlike the digital signal that takes only two values (//HIGH// or // | ||
| + | |||
| + | ==== Analog input ==== | ||
| + | For measuring the analogue signal, microcontrollers have built-in **analogue-to-digital converter** (ADC) that returns the digital value of the voltage level. Usually, the binary number corresponds to the input voltage, not the value in Volts. The number of bits of the output value depends on the accuracy and internal construction of the converter and usually varies between 8 and 12. | ||
| + | |||
| + | **analogRead()** | ||
| + | |||
| + | The function // | ||
| + | |||
| + | The syntax of a function is the following: | ||
| + | <code c> | ||
| + | analogRead(pin); | ||
| + | </ | ||
| + | |||
| + | The parameter //pin// is the pin's name whose value is read. | ||
| + | |||
| + | The return type of the function is the integer value. On the Arduino Uno boards, it ranges between 0 and 1023. The reading of each analogue input takes around 100 ms. | ||
| + | |||
| + | < | ||
| + | Not every pin can be used as an analogue input. Read the documentation of the chosen development board for details. | ||
| + | </ | ||
| + | |||
| + | ==== Analog output ==== | ||
| + | Unlike analogue input, the analogue output does not generate varying voltage directly on the pin. In general, it uses the technique known as (//Pulse Width Modulation// | ||
| + | |||
| + | **analogWrite()** | ||
| + | |||
| + | The function // | ||
| + | |||
| + | The syntax of a function is the following: | ||
| + | <code c> | ||
| + | analogWrite(pin, | ||
| + | </ | ||
| + | |||
| + | The parameter //pin// is the number of the pin. | ||
| + | |||
| + | The parameter //value// is the PWM signal value that can differ from 0 (off) to 255 (100% on). | ||
| + | |||
| + | This function does not have the return type. | ||
| + | |||
| + | < | ||
| + | Because an internal timer often generates PWM output, not every pin can be used as analogue output. Read the documentation of the chosen development board for details. | ||
| + | </ | ||
| + | |||
| + | The following example shows reading an analogue value from the A0 input of an Arduino Uno board and writing the analogue value to the output that can control the intensity of the LED. | ||
| + | |||
| + | <code c> | ||
| + | #define LED_pin 3 //the pin number is chosen to support PWM generation | ||
| + | |||
| + | void setup() { | ||
| + | pinMode(LED_pin, | ||
| + | } | ||
| + | |||
| + | int value; | ||
| + | |||
| + | void loop() { | ||
| + | value = analogRead(A0); | ||
| + | value = value >> 2; //it should be converted to the value 0-255 | ||
| + | analogWrite(LED_pin, | ||
| + | } | ||
| + | </ | ||
| + | |||