diff --git a/cours/SIN/03-can.md b/cours/SIN/03-can.md new file mode 100644 index 0000000..9b40196 --- /dev/null +++ b/cours/SIN/03-can.md @@ -0,0 +1,141 @@ +--- +title: Le CAN +subject: Cours +kernelspec: + name: python3 + display_name: Python 3 +abbreviations: + CAN: Convertisseur Analogique Numérique +--- + +# Définition + +:::{prf:definition} CAN +:nonumber: true +Un convertisseur analogique-numérique est un dispositif électronique dont la fonction est de traduire une grandeur analogique en une valeur numérique codée sur plusieurs bits. Le signal converti est généralement une tension électrique. + +Source : Article _[Convertisseur analogique-numérique](http://fr.wikipedia.org/wiki/Convertisseur_analogique-num%C3%A9rique)_ de [Wikipédia en français](https://fr.wikipedia.org/) ([auteurs](http://fr.wikipedia.org/w/index.php?title=Convertisseur_analogique-num%C3%A9rique&action=history)) +::: + +# L'échantillonage du signal +L'échantillonage du signal est la prise d'une valeur à un intervalle régulier de temps. L'intervalle entre deux valeurs s'appelle **période d'échantillonage**. On la note $T_e$ (en secondes). On parle aussi de **fréquence d'échantillonage** $f_e=\frac{1}{T_e}$ (en Hertz), qui correspond au nombre de valeurs prises chaque seconde. + +Le **quantum** correspond au plus petit écart quantifiable (la "hauteur d'une marche"). On le note $q$ et son unité est celle du signal d'entrée (généralement le Volt). + +La **tension de pleine échelle** ou **tension de référence** est la tension maximale quantifiable par le CAN. On la note $V_\text{pe}$ ou $V_\text{ref}$. + +Le nombre de valeurs que peut générer le convertisseur se note $N$ et dépend du nombre de bits $n$ du convertisseur. Ainsi : $N=2^n$. + +On obtient la relation suivante : $q=\frac{V_\text{pe}}{N}=\frac{V_\text{pe}}{2^n}$. + +# Exemple de conversion +On donne en @fig:exemple-can l'exemple d'un CAN de tension de référence 5 V fonctionnant sur 3 bits avec une fréquence d'échantillonage de 2 Hz. + +La **caractéristique** du CAN est la courbe représentant la valeur numérique en sortie en fonction de la valeur analogique en entrée (@fig:carac-can). + +````{figure} +:label: fig:exemple-can +```{code-cell} python +:tags: [remove-input] +import altair as alt +import numpy as np +import pandas as pd +from scipy import interpolate + +rng = np.random.default_rng(25) + +n = 20 +t_max = 16 + +T = np.linspace(0, t_max, 1601) +y = np.clip( + interpolate.BSpline(np.linspace(0, t_max, n), 5 * rng.random(n), 2)(T), + 0, + 5, +) +y_n = np.full([1601], np.nan) +y_n[::50] = np.floor(y[::50] * 8 / 5) +y_n[y_n == 8] = 7 + + +data = pd.DataFrame({ + "t": T, + "s": y, + "s_n": y_n, +}) + +base = alt.Chart( + data +).encode( + alt.X("t:Q").axis(title="Temps (s)").scale(domain=(0,t_max)), +) + +ch = base.mark_line( + interpolate="basis", + strokeWidth=3, + color="#6666cc", +).encode( + alt.Y("s:Q", axis=alt.Axis(title="Signal analogique", titleColor="#6666cc")).scale(domain=(0,5)), +) + +ch_n = base.mark_point( + filled=True, + color="#ff6600", +).encode( + alt.Y( + "s_n:Q", + axis=alt.Axis( + title="Signal numérisé", + titleColor="#ff6600", + values=np.arange(8), + ) + ).scale(domain=(0,8)), +) + +alt.layer(ch_n, ch).resolve_scale( + y="independent", +).properties( + width="container", + height=200, +) + + +``` +Signal analogique et signal numérisé. +```` + +````{figure} +:label: fig:carac-can +```{code-cell} python +:tags: [remove-input] +import altair as alt +import numpy as np +import pandas as pd +from scipy import interpolate + +N = 8 +s_n = np.arange(N+1) +s_n[-1] = s_n[-2] +data = pd.DataFrame({ + "s_n": s_n, + "s_a": np.linspace(0, 5, N+1), +}) + +alt.Chart( + data +).mark_line( + interpolate="step-after", + strokeWidth=3, + color="#ff6600", +).encode( + alt.X("s_a:Q").axis(title="Signal Analogique").scale(domain=(0,5)), + alt.Y("s_n:Q", axis=alt.Axis(title="Signal numérique", values=np.arange(N))).scale(domain=(0,N)), +).properties( + width=200, + height=200, +) + + +``` +Caractéristique du CAN. +```` \ No newline at end of file