(Belangrijk) Hoofdstuk 7 ADC
We hebben geleerd hoe we de helderheid van een LED kunnen regelen via PWM en dat PWM geen echte analoog is signaal. In dit hoofdstuk leren we hoe we analoge waarden kunnen uitlezen via een ADC-module en deze analoog kunnen converteren waarden digitaal.
In dit project zullen we de ADC-functie van een ADC-module gebruiken om de spanningswaarde van een potentiometer te lezen.
Componentenlijst


Configureer I2C en installeer Smbus als u dat nog niet heeft gedaan klik dan hier voor uitleg.
klik dan hier voor uitleg.
Pyton Codes
ADC.py lees de spanningswaarde van de potentiometer.
#!/usr/bin/env python3
########################################################################
# Filename : ADC.py
# Description : Use ADC module to read the voltage value of potentiometer.
# Author : www.freenove.com
# modification: 2023/05/11
########################################################################
import time
from ADCDevice import *
adc = ADCDevice() # Define an ADCDevice class object
def setup():
global adc
if(adc.detectI2C(0x48)): # Detect the pcf8591.
adc = PCF8591()
elif(adc.detectI2C(0x4b)): # Detect the ads7830
adc = ADS7830()
else:
print("No correct I2C address found, \n"
"Please use command 'i2cdetect -y 1' to check the I2C address! \n"
"Program Exit. \n");
exit(-1)
def loop():
while True:
value = adc.analogRead(0) # read the ADC value of channel 0
voltage = value / 255.0 * 3.3 # calculate the voltage value
print ('ADC Value : %d, Voltage : %.2f'%(value,voltage))
time.sleep(0.1)
def destroy():
adc.close()
if __name__ == '__main__': # Program entrance
print ('Program is starting ... ')
try:
setup()
loop()
except KeyboardInterrupt: # Press ctrl-c to end the program.
destroy()
print("Ending program")
https://github.com/mheidenreich/ADCBasics
Circuitkennis
ADC
Een ADC is een elektronisch geïntegreerd circuit dat wordt gebruikt om analoge signalen, zoals spanningen, om te zetten in digitaal of binair formulier bestaande uit 1s en 0s. Het bereik van onze ADC-module is 8 bits, wat betekent dat de resolutie 2^8=256 is, zodat het bereik (bij 3,3 V) gelijkelijk wordt verdeeld over 256 delen.
Elke analoge waarde kan worden toegewezen aan één digitale waarde met behulp van de resolutie van de omzetter. Dus hoe meer stukjes de ADC heeft, hoe dichter de analoge partitie zal zijn en hoe groter de nauwkeurigheid van de resulterende conversie.

Onderafdeling 1: het analoge binnenbereik van 0V-3,3/256 V komt overeen met digitaal 0;
Onderafdeling 2: het analoge binnenbereik van 3,3 /256 V-2*3,3 /256V komt overeen met digitaal 1;
…
Het resulterende analoge signaal zal dienovereenkomstig worden verdeeld.
Componentenkennis
Potentiometer
Potentiometer is een weerstandselement met drie aansluitdelen. In tegenstelling tot de weerstanden die we tot nu toe hebben gebruikt in ons project met een vaste weerstandswaarde kan de weerstandswaarde van een potentiometer worden aangepast. A potentiometer bestaat vaak uit een resistieve substantie (een draad of koolstofelement) en een beweegbaar contact borstel. Wanneer de borstel langs het weerstandselement beweegt, zal er een verandering in de weerstand van de weerstand optreden uitgangszijde van de potentiometer (3) (of verandering in de spanning van het circuit dat er deel van uitmaakt).
De illustratie hieronder vertegenwoordigt een lineaire schuifpotentiometer en het elektronische symbool aan de rechterkant.

Tussen potentiometer pin 1 en pin 2 bevindt zich het weerstandselement (een weerstandsdraad of koolstof) en pin 3 bevindt zich verbonden met de borstel die contact maakt met het weerstandselement.
In onze illustratie, wanneer de borstel van pin 1 naar pin 2 beweegt, zal de weerstandswaarde tussen pin 1 en pin 3 lineair toenemen (totdat deze de hoogste waarde van het weerstandselement) en tegelijkertijd de weerstand tussen pin 2 en pin 3 lineair afnemen en omgekeerd tot nul.
In het midden van de schuifregelaar de gemeten weerstandswaarden tussen pin 1 en 3 en tussen pin 2 en 3 zal hetzelfde zijn.
In een circuit zijn beide zijden van het weerstandselement vaak verbonden met de positieve en negatieve elektroden van stroom.
Wanneer u de borstel “pin 3” verschuift, kunt u een variabele spanning verkrijgen binnen het bereik van de voeding.

Draaipotentiometer
Draaipotentiometers en lineaire potentiometers hebben dezelfde functie; het enige verschil is de
fysieke actie is een roterende beweging in plaats van een glijdende beweging.


I2C-communicatie
I2C (Inter-Integrated Circuit) heeft een tweedraads seriële communicatiemodus, die kan worden gebruikt om een microcontroller en zijn randapparatuur.
Apparaten die I2C-communicatie gebruiken, moeten worden aangesloten op de seriële datalijn (SDA) en seriële kloklijn (SCL) (I2C-bus genoemd).
Elk apparaat heeft een uniek adres te gebruiken als zender of ontvanger om te communiceren met apparaten die via de bus zijn aangesloten.
Extra project proefje met led lamp dimmer
Deze video demonstreert hoe je Freenove ADC-chips PCF8591 en ADS7830 met Raspberry Pi en Python kunt gebruiken om een digitale LED-dimmer met een potentiometer te creëren. Ik leg ook uit hoe je generatorfuncties kunt gebruiken met de broneigenschap van gpiozero-objecten.
0:00 Intro
1:22 Schematic Diagrams
1:36 Breadboard Circuit
2:41 Potentiometers Explained
3:36 How to Detect the ACD Chip
5:00 Basic Test Program
8:54 Better Digital LED Dimming
10:05 gpiozero source-values
10:55 Python Generators Explained
12:06 Complete Program Complete code: https://github.com/mheidenreich/ADCBa…
(Note: code posted may contain small updates and/or bug fixes not shown in the video)



#!/usr/bin/python3
"""
Program: ADC Basics (adc.py)
Author: M. Heidenreich, (c) 2020
Description: This code is provided in support of the following YouTube tutorial:
https://youtu.be/BdmQcayG8Gg
This tutorial demonstrates how to use Freenove ADC Chips PCF8591 and ADS7830
with Raspberry Pi and Python to create a digital LED dimmer with a potentiometer.
THIS SOFTWARE AND LINKED VIDEO TOTORIAL ARE PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS
ALL WARRANTIES INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS.
IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES
OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
"""
from signal import signal, SIGTERM, SIGHUP, pause
from smbus import SMBus
from gpiozero import PWMLED
from time import sleep
from math import log10
bus = SMBus(1)
led = PWMLED(26)
steps = 255
fade_factor = (steps * log10(2))/(log10(steps))
ads7830_commands = (0x84, 0xc4, 0x94, 0xd4, 0xa4, 0xe4, 0xb4, 0xf4)
def safe_exit(signum, frame):
exit(1)
def read_pcf8591(input):
bus.write_byte(0x48, 0x40+input)
return bus.read_byte(0x48)
def read_ads7830(input):
bus.write_byte(0x4b, ads7830_commands[input])
return bus.read_byte(0x4b)
def values(input):
while True:
value = read_ads7830(input)
yield (pow(2, (value/fade_factor))-1)/steps
try:
signal(SIGTERM, safe_exit)
signal(SIGHUP, safe_exit)
led.source_delay = 0.05
led.source = values(0)
pause()
except KeyboardInterrupt:
pass
finally:
led.source = None
led.close()
Meer projecten…https://pimylifeup.com/category/projects/electronics/

