- DDS ఫంక్షన్ జనరేటర్ అంటే ఏమిటి?
- AD9833 ఫంక్షన్ జనరేటర్ IC యొక్క పనిని అర్థం చేసుకోండి
- AD9833 ఆధారిత ఫంక్షన్ జనరేటర్ను నిర్మించడానికి అవసరమైన భాగాలు
- AD9833 బేస్డ్ ఫంక్షన్ జనరేటర్ - స్కీమాటిక్ రేఖాచిత్రం
- AD9833 బేస్డ్ ఫంక్షన్ జనరేటర్ - ఆర్డునో కోడ్
- AD9833 బేస్డ్ ఫంక్షన్ జనరేటర్ను పరీక్షిస్తోంది
- మరింత మెరుగుదలలు
మీరు నా లాంటి ఎలక్ట్రానిక్ i త్సాహికులు అయితే, వివిధ ఎలక్ట్రానిక్ సర్క్యూట్లతో సర్దుబాటు చేయాలనుకుంటే, మంచి ఫంక్షన్ జనరేటర్ కలిగి ఉండటం కొన్నిసార్లు తప్పనిసరి అవుతుంది. కానీ ఒకదానిని సొంతం చేసుకోవడం ఒక సమస్య ఎందుకంటే అలాంటి ప్రాథమిక పరికరాలకు అదృష్టం ఖర్చవుతుంది. మీ స్వంత పరీక్షా పరికరాలను నిర్మించడం చౌకైనది మాత్రమే కాదు, మీ జ్ఞానాన్ని మెరుగుపరచడానికి గొప్ప మార్గం.
కాబట్టి ఈ వ్యాసంలో, మేము ఆర్డునో మరియు AD9833 DDS ఫంక్షన్ జనరేటర్ మాడ్యూల్తో సరళమైన సిగ్నల్ జనరేటర్ను నిర్మించబోతున్నాము, ఇది అవుట్పుట్ వద్ద గరిష్టంగా 12 MHz పౌన frequency పున్యంతో సైన్, స్క్వేర్ మరియు త్రిభుజం తరంగాలను ఉత్పత్తి చేయగలదు. చివరకు, మేము మా ఓసిల్లోస్కోప్ సహాయంతో అవుట్పుట్ ఫ్రీక్వెన్సీని పరీక్షించబోతున్నాము.
ప్రాథమిక అనలాగ్ సర్క్యూట్ల సహాయంతో మేము ఇంతకుముందు సింపుల్ సైన్ వేవ్ జనరేటర్, స్క్వేర్ వేవ్ జనరేటర్ మరియు ట్రయాంగిల్ వేవ్ జనరేటర్ను నిర్మించాము. మీరు కొన్ని ప్రాథమిక వేవ్ఫార్మ్ జనరేటర్ సర్క్యూట్ల కోసం చూస్తున్నారా అని మీరు వాటిని తనిఖీ చేయవచ్చు. అలాగే, మీరు AD9833 మాడ్యూల్ ఉపయోగించకుండా చౌకైన ఆర్డునో ఫంక్షన్ జెనరేటర్ను నిర్మించాలనుకుంటే, మీరు DIY ఆర్డునో వేవ్ఫార్మ్ జనరేటర్ ప్రాజెక్ట్ను చూడవచ్చు.
DDS ఫంక్షన్ జనరేటర్ అంటే ఏమిటి?
పేరు సూచించినట్లుగా, ఫంక్షన్ జెనరేటర్ అనేది సెట్టింగ్పై నిర్దిష్ట ఫ్రీక్వెన్సీతో నిర్దిష్ట తరంగ రూపాన్ని అవుట్పుట్ చేయగల పరికరం. ఉదాహరణకు, మీ అవుట్పుట్ ఫ్రీక్వెన్సీ ప్రతిస్పందనను పరీక్షించాలనుకుంటున్న LC ఫిల్టర్ మీకు ఉందని పరిగణించండి, మీరు ఫంక్షన్ జెనరేటర్ సహాయంతో దీన్ని సులభంగా చేయవచ్చు. మీరు చేయవలసిందల్లా మీకు కావలసిన అవుట్పుట్ ఫ్రీక్వెన్సీ మరియు వేవ్ఫార్మ్ను సెట్ చేయడం, ఆపై ప్రతిస్పందనను పరీక్షించడానికి మీరు దాన్ని క్రిందికి లేదా పైకి క్రాంక్ చేయవచ్చు. ఇది ఒక ఉదాహరణ మాత్రమే, జాబితా కొనసాగుతున్న కొద్దీ మీరు దానితో మరిన్ని పనులు చేయవచ్చు.
DDS అంటే డైరెక్ట్ డిజిటల్ సింథసిస్. ఇది ఒక రకమైన వేవ్ఫార్మ్ జెనరేటర్, ఇది డిజిటల్ నుండి అనలాగ్ కన్వర్టర్లు (DAC) ను భూమి నుండి పైకి సిగ్నల్ నిర్మించడానికి ఉపయోగిస్తుంది. సైన్ వేవ్ ఉత్పత్తి చేయడానికి ఈ పద్ధతి ప్రత్యేకంగా ఉపయోగించబడుతుంది. కానీ మనం ఉపయోగిస్తున్న ఐసి స్క్వేర్ లేదా త్రిభుజాకార తరంగ సంకేతాలను ఉత్పత్తి చేయగలదు. DDS చిప్ లోపల జరిగిన ఆపరేషన్లు డిజిటల్ కాబట్టి ఇది ఫ్రీక్వెన్సీని చాలా వేగంగా మార్చగలదు లేదా ఇది ఒక సిగ్నల్ నుండి మరొకదానికి చాలా వేగంగా మారవచ్చు. ఈ పరికరం విస్తృత ఫ్రీక్వెన్సీ స్పెక్ట్రంతో చక్కటి ఫ్రీక్వెన్సీ రిజల్యూషన్ను కలిగి ఉంది.
AD9833 ఫంక్షన్ జనరేటర్ IC యొక్క పనిని అర్థం చేసుకోండి
మా ప్రాజెక్ట్ యొక్క గుండె వద్ద AD9833 ప్రోగ్రామబుల్ వేవ్ఫార్మ్ జనరేటర్ IC ఉంది, ఇది అనలాగ్ పరికరాలచే రూపొందించబడింది మరియు అభివృద్ధి చేయబడింది. ఇది తక్కువ శక్తి, ప్రోగ్రామబుల్ వేవ్ఫార్మ్ జనరేటర్, ఇది 12 MHz గరిష్ట పౌన frequency పున్యంతో సైన్, త్రిభుజాకార మరియు చదరపు తరంగాన్ని ఉత్పత్తి చేయగలదు. ఇది చాలా ప్రత్యేకమైన ఐసి, ఇది సాఫ్ట్వేర్ ప్రోగ్రామ్తో అవుట్పుట్ ఫ్రీక్వెన్సీని మరియు దశను మార్చగలదు. ఇది 3 వైర్ SPI ఇంటర్ఫేస్ను కలిగి ఉంది, అందుకే ఈ IC తో కమ్యూనికేట్ చేయడం చాలా సులభం మరియు సులభం అవుతుంది. ఈ IC యొక్క ఫంక్షనల్ బ్లాక్ రేఖాచిత్రం క్రింద చూపబడింది.
ఈ ఐసి యొక్క పని చాలా సులభం. పై ఫంక్షనల్ బ్లాక్ రేఖాచిత్రాన్ని పరిశీలిస్తే, మనకు ఒక దశ సంచితం ఉందని గమనించవచ్చు, దీని పని 0 నుండి 2π వరకు ప్రారంభమయ్యే సైన్ వేవ్ యొక్క అన్ని డిజిటల్ విలువలను నిల్వ చేయడం. తరువాత, మనకు SIN ROM ఉంది, దీని పని దశ సమాచారాన్ని తరువాత నేరుగా వ్యాప్తిలోకి మ్యాప్ చేయవచ్చు. SIN ROM డిజిటల్ దశ సమాచారాన్ని ఒక శోధన పట్టికకు చిరునామాగా ఉపయోగిస్తుంది మరియు దశ సమాచారాన్ని వ్యాప్తిగా మారుస్తుంది. చివరగా, మనకు 10-బిట్ డిజిటల్ టు అనలాగ్ కన్వర్టర్ ఉంది, దీని పని SIN ROM నుండి డిజిటల్ డేటాను స్వీకరించడం మరియు దానిని సంబంధిత అనలాగ్ వోల్టేజీలుగా మార్చడం, అంటే అవుట్పుట్ నుండి మనకు లభిస్తుంది. అవుట్పుట్ వద్ద, మనకు కొంచెం సాఫ్ట్వేర్ కోడ్తో ఆన్ లేదా ఆఫ్ చేయగల స్విచ్ కూడా ఉంది. మేము దాని గురించి తరువాత వ్యాసంలో మాట్లాడుతాము.మీరు పైన చూసే వివరాలు ఐసి లోపల ఏమి జరుగుతుందో చాలా తీసివేసిన సంస్కరణ, మరియు మీరు పైన చూసిన చాలా వివరాలు AD9833 డేటాషీట్ నుండి తీసుకోబడ్డాయి, మీరు మరింత సమాచారం కోసం కూడా తనిఖీ చేయవచ్చు.
AD9833 ఆధారిత ఫంక్షన్ జనరేటర్ను నిర్మించడానికి అవసరమైన భాగాలు
AD9833 ఆధారిత ఫంక్షన్ జెనరేటర్ను నిర్మించడానికి అవసరమైన భాగాలు క్రింద ఇవ్వబడ్డాయి, మేము ఈ సర్క్యూట్ను చాలా సాధారణ భాగాలతో రూపొందించాము, ఇది ప్రతిరూపణ ప్రక్రియను చాలా సులభం చేస్తుంది.
- ఆర్డునో నానో - 1
- AD9833 DDS ఫంక్షన్ జనరేటర్ - 1
- 128 X 64 OLED డిస్ప్లే - 1
- సాధారణ రోటరీ ఎన్కోడర్ - 1
- DC బారెల్ జాక్ - 1
- LM7809 వోల్టేజ్ రెగ్యులేటర్ - 1
- 470uF కెపాసిటర్ - 1
- 220 యుఎఫ్ కెపాసిటర్ - 1
- 104 పిఎఫ్ కెపాసిటర్ - 1
- 10 కె రెసిస్టర్ - 6
- స్పర్శ స్విచ్లు - 4
- స్క్రూ టెర్మినల్ 5.04 మిమీ - 1
- అవివాహిత శీర్షిక - 1
- 12 వి పవర్ సోర్స్ - 1
AD9833 బేస్డ్ ఫంక్షన్ జనరేటర్ - స్కీమాటిక్ రేఖాచిత్రం
AD9833 మరియు Arduino బేస్డ్ ఫంక్షన్ జనరేటర్ కోసం పూర్తి సర్క్యూట్ రేఖాచిత్రం క్రింద చూపబడింది.
మనకు కావలసిన ఫ్రీక్వెన్సీని ఉత్పత్తి చేయడానికి మేము ఆర్డునోతో AD9833 ను ఉపయోగించబోతున్నాము. మరియు ఈ విభాగంలో, మేము అన్ని వివరాలను స్కీమాటిక్ సహాయంతో వివరిస్తాము; సర్క్యూట్తో ఏమి జరుగుతుందో దాని గురించి క్లుప్త వివరణ ఇస్తాను. తో లెట్ యొక్క ప్రారంభ AD9833 మాడ్యూల్. AD9833 మాడ్యూల్ ఫంక్షన్ జనరేటర్ మాడ్యూల్ మరియు ఇది స్కీమాటిక్ ప్రకారం ఆర్డునోతో అనుసంధానించబడి ఉంది. సర్క్యూట్ను శక్తివంతం చేయడానికి, మేము మంచి డీకప్లింగ్ కెపాసిటర్తో LM7809 వోల్టేజ్ రెగ్యులేటర్ IC ని ఉపయోగిస్తున్నాము, ఎందుకంటే ఇది అవసరం ఎందుకంటే సరఫరా శబ్దం అవాంఛిత అవుట్పుట్ ఫలితంగా అవుట్పుట్ సిగ్నల్తో జోక్యం చేసుకోవచ్చు. ఎప్పటిలాగే, ఆర్డునో ఈ ప్రాజెక్ట్ కోసం మెదడుగా పనిచేస్తోంది. సెట్ ఫ్రీక్వెన్సీ మరియు ఇతర విలువైన సమాచారాన్ని ప్రదర్శించడానికి, మేము 128 X 64 OLED డిస్ప్లే మాడ్యూల్ను కనెక్ట్ చేసాము. ఫ్రీక్వెన్సీ పరిధిని మార్చడానికి, మేము మూడు స్విచ్లను ఉపయోగిస్తున్నాము. మొదటిది ఫ్రీక్వెన్సీని Hz కు సెట్ చేస్తుంది, రెండవది అవుట్పుట్ ఫ్రీక్వెన్సీని KHz కు సెట్ చేస్తుంది మరియు మూడవది ఫ్రీక్వెన్సీని MHz కు సెట్ చేస్తుంది, అవుట్పుట్ను ఎనేబుల్ లేదా డిసేబుల్ చెయ్యడానికి ఉపయోగించే మరొక బటన్ కూడా మనకు ఉంది. చివరగా, మాకు రోటరీ ఎన్కోడర్ ఉంది,మరియు మేము దానితో కొన్ని పుల్-అప్ రెసిస్టర్ను అటాచ్ చేయాలి లేకపోతే ఆ స్విచ్లు పనిచేయవు ఎందుకంటే మేము పూలింగ్ పద్ధతిలో బటన్ ప్రెస్ ఈవెంట్ను తనిఖీ చేస్తున్నాము. రోటరీ ఎన్కోడర్ ఫ్రీక్వెన్సీని మార్చడానికి ఉపయోగించబడుతుంది మరియు సెట్ వేవ్ఫార్మ్ను ఎంచుకోవడానికి రోటరీ ఎన్కోడర్ లోపల స్పర్శ స్విచ్ ఉపయోగించబడుతుంది.
AD9833 బేస్డ్ ఫంక్షన్ జనరేటర్ - ఆర్డునో కోడ్
ఈ ప్రాజెక్ట్లో ఉపయోగించిన పూర్తి కోడ్ను ఈ పేజీ దిగువన చూడవచ్చు. అవసరమైన హెడర్ ఫైల్స్ మరియు సోర్స్ ఫైళ్ళను జోడించిన తరువాత, మీరు నేరుగా ఆర్డునో ఫైల్ను కంపైల్ చేయగలరు. మీరు క్రింద ఇచ్చిన లింక్ నుండి ad9833 Arduino లైబ్రరీ మరియు ఇతర లైబ్రరీలను డౌన్లోడ్ చేసుకోవచ్చు లేదా లేకపోతే లైబ్రరీని ఇన్స్టాల్ చేయడానికి బోర్డు మేనేజర్ పద్ధతిని ఉపయోగించవచ్చు.
- బిల్ విలియమ్స్ రచించిన AD9833 లైబ్రరీని డౌన్లోడ్ చేయండి
- అడాఫ్రూట్ చేత SSD1306 OLED లైబ్రరీని డౌన్లోడ్ చేయండి
- Adafruit GFX లైబ్రరీని డౌన్లోడ్ చేయండి
ఐనోలోని కోడ్ యొక్క వివరణ . ఫైల్ క్రింది విధంగా ఉంది. మొదట, అవసరమైన అన్ని లైబ్రరీలను చేర్చడం ద్వారా మేము ప్రారంభిస్తాము. AD9833 DDS మాడ్యూల్ కోసం లైబ్రరీ మొదట OLED కోసం లైబ్రరీని అనుసరిస్తుంది మరియు మా కొన్ని లెక్కలకు గణిత లైబ్రరీ అవసరం.
AD9833 మాడ్యూల్ కోసం # చేర్చండి // LIbrary # చేర్చండి
తరువాత, బటన్లు, స్విచ్, రోటరీ ఎన్కోడర్ మరియు OLED లకు అవసరమైన అన్ని ఇన్పుట్ మరియు అవుట్పుట్ పిన్నులను మేము నిర్వచిస్తాము.
# SCREEN_WIDATA_PINH 128 // OLED డిస్ప్లే వెడల్పు పిక్సెల్లలో నిర్వచించండి # SCREEN_HEIGHT 64 // OLED డిస్ప్లే ఎత్తు, పిక్సెల్లలో # నిర్వచించండి A6 // పుష్బటన్ Mhz లో ఫ్రీక్వెన్సీని సెట్ చేయడానికి # ENABLE_DISABLE_OUTPUT_PIN A7 // అవుట్పుట్ను ప్రారంభించడానికి / నిలిపివేయడానికి పుష్బటన్ # నిర్వచించండి FNC_PIN 4 // Fsync AD9833 మాడ్యూల్ అవసరం # CLK_PIN యొక్క 8 / ఎన్కోడర్ యొక్క డేటా పిన్ # BTN_PIN 9 ని నిర్వచించండి // ఎన్కోడర్లో అంతర్గత పుష్ బటన్
ఆ తరువాత, ఈ కోడ్లో అవసరమైన అన్ని వేరియబుల్స్ని మేము నిర్వచిస్తాము. మొదట, రోటరీ ఎన్కోడర్ విలువను నిల్వ చేసే పూర్ణాంక వేరియబుల్ కౌంటర్ను మేము నిర్వచించాము. తదుపరి రెండు వేరియబుల్స్ క్లాక్పిన్ మరియు క్లాక్పిన్స్టేట్ ఎన్కోడర్ దిశను అర్థం చేసుకోవడానికి అవసరమైన పిన్ విగ్రహాన్ని నిల్వ చేస్తాయి. మేము ఒక కలిగి సమయం ఈ వేరియబుల్ బటన్ debouncing కోసం ఉపయోగిస్తారు, ప్రస్తుత టైమర్ కౌంటర్ విలువలు కలిగి ఆ వేరియబుల్. తరువాత, మనకు సంతకం చేయని లాంగ్ వేరియబుల్ మాడ్యూల్ ఫ్రీక్వెన్సీ ఉంది, ఇది లెక్కించబడే ఫ్రీక్వెన్సీని కలిగి ఉంటుంది. తరువాత, మాకు డీబౌన్స్ ఆలస్యం ఉంది. ఈ ఆలస్యాన్ని అవసరమైన విధంగా సర్దుబాటు చేయవచ్చు. తరువాత, మనకు మూడు బూలియన్ వేరియబుల్స్ set_frequency_hz ఉన్నాయి,set_frequency_Khz, మరియు set_frequency_Mhz మాడ్యూల్ యొక్క ప్రస్తుత అమరికను నిర్ణయించడానికి ఈ మూడు వేరియబుల్స్ ఉపయోగించబడతాయి. మేము దాని గురించి మరింత వివరంగా తరువాత వ్యాసంలో మాట్లాడుతాము. తరువాత, అవుట్పుట్ వేవ్ఫార్మ్ యొక్క స్థితిని నిల్వ చేసే వేరియబుల్ మనకు ఉంది, డిఫాల్ట్ అవుట్పుట్ వేవ్ఫార్మ్ ఒక సైన్ వేవ్. చివరకు, మేము కలిగి encoder_btn_count ఉత్పత్తి తరంగ సెట్ ఉపయోగించే ఎన్కోడర్ బటన్ లెక్కింపు ఉంచుతున్నారు వేరియబుల్.
పూర్ణాంకానికి కౌంటర్ = 1; // రోటరీ ఎన్కోడర్ను ఇంటర్ క్లాక్పిన్గా మార్చినప్పుడు ఈ కౌంటర్ విలువ పెరుగుతుంది లేదా తగ్గుతుంది; రోటరీ ఎన్కోడర్ Int క్లాక్పిన్స్టేట్ ఉపయోగించే పిన్ స్థితి కోసం ప్లేస్హోల్డర్; రోటరీ ఎన్కోడర్ సంతకం చేయని పిన్ స్థితి కోసం ప్లేస్హోల్డర్ సంతకం చేయని కాలం = 0; // సంతకం చేయని పొడవైన మాడ్యూల్ను తగ్గించడానికి ఉపయోగిస్తారు ఫ్రీక్వెన్సీ; // అవుట్పుట్ ఫ్రీక్వెన్సీ లాంగ్ డీబౌన్స్ సెట్ చేయడానికి ఉపయోగిస్తారు = 220; // ఆలస్యం బూల్ btn_state ని తొలగించండి; // AD98333 మాడ్యూల్ బూల్ సెట్_ఫ్రీక్వెన్సీ_హెచ్జ్ = 1 యొక్క అవుట్పుట్ను నిలిపివేయడానికి ఉపయోగిస్తారు; // AD9833 మాడ్యూల్ బూల్ సెట్_ఫ్రీక్వెన్సీ_ఖ్జ్ యొక్క డిఫాల్ట్ ఫ్రీక్వెన్సీ; bool set_frequency_mhz; స్ట్రింగ్ వేవ్ సెలెక్ట్ = "సిన్"; // మాడ్యూల్ యొక్క ప్రారంభ తరంగ రూపం int encoder_btn_count = 0; // ఎన్కోడర్ బటన్ను నొక్కడానికి ఉపయోగిస్తారు తరువాత, మన రెండు వస్తువులు ఒకటి OLED డిస్ప్లే కోసం మరియు మరొకటి AD9833 మాడ్యూల్ కోసం.Adafruit_SSD1306 డిస్ప్లే (SCREEN_WIDATA_PINH, SCREEN_HEIGHT, & వైర్, -1); AD9833 gen (FNC_PIN);
తరువాత, మనకు మా సెటప్ () ఫంక్షన్ ఉంది, ఆ సెటప్ ఫంక్షన్లో, డీబగ్గింగ్ కోసం సీరియల్ను ప్రారంభించడం ద్వారా ప్రారంభిస్తాము. మేము ప్రారంభ () పద్ధతి సహాయంతో AD9833 మాడ్యూల్ను ప్రారంభిస్తాము. తరువాత, మేము కేటాయించిన అన్ని రోటరీ ఎన్కోడర్ పిన్లను ఇన్పుట్గా సెట్ చేసాము. మరియు మేము క్లాక్ పిన్ యొక్క విలువను క్లాక్పిన్స్టేట్ వేరియబుల్లో నిల్వ చేస్తాము, ఇది రోటరీ ఎన్కోడర్కు అవసరమైన దశ.
తరువాత, మేము అన్ని బటన్ పిన్లను ఇన్పుట్గా సెట్ చేసి, display.begin () పద్ధతి సహాయంతో OLED డిస్ప్లేని ఎనేబుల్ చేస్తాము మరియు if స్టేట్మెంట్తో ఏదైనా లోపాలు ఉన్నాయో లేదో కూడా తనిఖీ చేస్తాము. అది పూర్తయినప్పుడు, మేము డిస్ప్లేని క్లియర్ చేసి, స్టార్టప్ స్ప్లాష్ స్క్రీన్ను ప్రింట్ చేస్తాము, మేము 2 సెకన్ల ఆలస్యాన్ని జోడిస్తాము, ఇది స్ప్లాష్ స్క్రీన్కు కూడా ఆలస్యం, చివరకు, మేము స్క్రీన్ను క్లియర్ చేసి అప్డేట్ చేసే అప్డేట్_డిస్ప్లే () ఫంక్షన్ని పిలుస్తాము. మరోసారి ప్రదర్శించు. Update_display () పద్ధతి యొక్క వివరాలు తరువాత వ్యాసంలో చర్చించబడతాయి.
శూన్య సెటప్ () {Serial.begin (9600); // సీరియల్ @ 9600 బాడ్ gen ని ప్రారంభించండి. ప్రారంభం (); // ఇది AD9833 ఆబ్జెక్ట్ పిన్మోడ్ (CLK_PIN, INPUT) ను ప్రకటించిన తర్వాత మొదటి ఆదేశం అయి ఉండాలి; // పిన్లను ఇన్పుట్ పిన్మోడ్గా సెట్ చేయడం (DATA_PIN, INPUT); పిన్మోడ్ (BTN_PIN, INPUT_PULLUP); క్లాక్పిన్స్టేట్ = డిజిటల్ రీడ్ (CLK_PIN); పిన్మోడ్ (SET_FREQUENCY_HZ, INPUT); // పిన్లను ఇన్పుట్ పిన్మోడ్గా సెట్ చేస్తుంది (SET_FREQUENCY_KHZ, INPUT); పిన్మోడ్ (SET_FREQUENCY_MHZ, INPUT); పిన్మోడ్ (ENABLE_DISABLE_OUTPUT_PIN, INPUT); if (! display.begin (SSD1306_SWITCHCAPVCC, 0x3C)) x // 128x64 Serial.println (F ("SSD1306 కేటాయింపు విఫలమైంది") కోసం చిరునామా 0x3D; (;;); } display.clearDisplay (); // స్క్రీన్ను క్లియర్ చేయండి display.setTextSize (2); // టెక్స్ట్ సైజు display.setTextColor (WHITE) సెట్ చేయండి; // సెట్ LCD కలర్ display.setCursor (30, 0); // కర్సర్ స్థానం display.println ("AD9833") సెట్ చేయండి; // ఈ టెక్స్ట్ డిస్ప్లేని ప్రింట్ చేయండి.setCursor (17, 20); // కర్సర్ స్థానం సెట్ చేయండి display.println ("ఫంక్షన్"); // ఈ టెక్స్ట్ display.setCursor (13, 40) ను ప్రింట్ చేయండి; // కర్సర్ స్థానం display.println ("జనరేటర్") సెట్ చేయండి; // ఈ టెక్స్ట్ display.display () ను ప్రింట్ చేయండి; // ప్రదర్శన ఆలస్యాన్ని నవీకరించండి (2000); // 2 SEC అప్డేట్_డిస్ప్లే ఆలస్యం (); // కాల్ అప్డేట్_డిస్ప్లే ఫంక్షన్}
తరువాత, మన లూప్ () ఫంక్షన్ ఉంది, అన్ని ప్రధాన కార్యాచరణలు లూప్ విభాగంలో వ్రాయబడ్డాయి.
మొదట, మేము రోటరీ ఎన్కోడర్ యొక్క క్లాక్ పిన్ను చదివి, మనం ఇంతకుముందు ప్రకటించిన క్లాక్ పిన్ వేరియబుల్ లో భద్రపరుస్తాము. తరువాత, if స్టేట్మెంట్లో, పిన్ యొక్క మునుపటి విలువ మరియు పిన్ యొక్క ప్రస్తుత విలువ సమానంగా ఉందా లేదా అని మేము తనిఖీ చేస్తాము మరియు పిన్ యొక్క ప్రస్తుత విలువను కూడా మేము తనిఖీ చేస్తాము. ఇవన్నీ నిజమైతే, మేము డేటా పిన్ కోసం తనిఖీ చేస్తాము, నిజమైతే ఎన్కోడర్ అపసవ్య దిశలో తిరుగుతున్నదని అర్థం మరియు కౌంటర్ - కమాండ్ సహాయంతో మేము కౌంటర్ విలువను తగ్గిస్తాము. లేకపోతే మనం కౌంటర్ విలువను కౌంటర్ ++ కమాండ్తో పెంచుతాము. చివరగా, కనీస విలువను 1 కి సెట్ చేయడానికి మరొక ఇఫ్ స్టేట్మెంట్ ఉంచాము. తరువాత, మేము క్లాక్ పిన్ స్టేట్ ను ప్రస్తుత క్లాక్ పిన్ తో అప్డేట్ చేస్తాముభవిష్యత్ ఉపయోగం కోసం విలువ.
శూన్య లూప్ () {క్లాక్పిన్ = డిజిటల్ రీడ్ (CLK_PIN); if (క్లాక్పిన్! = క్లాక్పిన్స్టేట్ && క్లాక్పిన్ == 1) {if (డిజిటల్ రీడ్ (DATA_PIN)! = క్లాక్పిన్) {కౌంటర్ -; } else {counter ++; // ఎన్కోడర్ CW ని తిరుగుతోంది కాబట్టి ఇంక్రిమెంట్} if (కౌంటర్ <1) కౌంటర్ = 1; సీరియల్.ప్రింట్ల్న్ (కౌంటర్); update_display (); }
తరువాత, బటన్ ప్రెస్ను గుర్తించడానికి మా కోడ్ ఉంది. ఈ విభాగంలో, (డిజిటల్ రీడ్ (BTN_PIN) == తక్కువ && మిల్లీస్ () - సమయం> ఖండించండి) , ఈ ప్రకటనలో, మేము మొదట బటన్ ఉంటే తనిఖీ చేస్తాము. పిన్ తక్కువగా ఉంది లేదా కాదు, అది తక్కువగా ఉంటే, అది నొక్కినప్పుడు. డీబౌన్స్ ఆలస్యం తో టైమర్ విలువను మళ్ళీ తనిఖీ చేస్తాము, రెండు స్టేట్మెంట్స్ నిజమైతే, మేము దానిని విజయవంతమైన బటన్ ప్రెస్ చర్యగా ప్రకటిస్తాము, కనుక మనం ఎన్కోడర్_బిటిఎన్_కౌంట్ విలువను పెంచుతాము. తరువాత, గరిష్ట కౌంటర్ విలువను 2 కు సెట్ చేయడానికి స్టేట్మెంట్ మరొకటి ప్రకటిస్తాము, మనకు ఇది అవసరం ఎందుకంటే అవుట్పుట్ తరంగ రూపాన్ని సెట్ చేయడానికి మేము దీనిని ఉపయోగిస్తున్నాము .స్టేట్మెంట్లు అలా చేస్తే వరుసగా మూడు, విలువ సున్నా అయితే, సైన్ వేవ్ఫార్మ్ ఎంచుకోబడుతుంది, అది ఒకటి అయితే, ఇది చదరపు వేవ్, మరియు విలువ 2 అయితే, అది త్రిభుజాకార తరంగం. ఈ మూడు స్టేట్మెంట్లలో, అప్డేట్_డిస్ప్లే () ఫంక్షన్తో డిస్ప్లేని అప్డేట్ చేస్తాము . చివరకు, మేము ప్రస్తుత టైమర్ కౌంటర్ విలువతో టైమ్ వేరియబుల్ను అప్డేట్ చేస్తాము.
// మేము తక్కువ సిగ్నల్ను గుర్తించినట్లయితే, (డిజిటల్ రీడ్ (BTN_PIN) == LOW && మిల్లీస్ () - సమయం> డీబౌన్స్) {encoder_btn_count ++; // విలువలను పెంచండి (encoder_btn_count> 2) // విలువ 2 కన్నా ఎక్కువ ఉంటే దాన్ని 0 {encoder_btn_count = 0 కు రీసెట్ చేయండి; } if (encoder_btn_count == 0) {// విలువ 0 ఉంటే సైన్ వేవ్ ఎంచుకోబడుతుంది waveSelect = "SIN"; // పాపం విలువతో స్ట్రింగ్ వేరియబుల్ను నవీకరించండి update_display (); // ప్రదర్శనను నవీకరించండి} if (encoder_btn_count == 1) {// విలువ 1 చదరపు తరంగంగా ఎంచుకోబడితే waveSelect = "SQR"; // స్ట్రింగ్ వేరియబుల్ను SQR విలువ అప్డేట్_డిస్ప్లే () తో నవీకరించండి; // ప్రదర్శనను నవీకరించండి} if (encoder_btn_count == 2) {// విలువ 1 ఉంటే త్రిభుజాకార తరంగం ఎంచుకోబడుతుంది waveSelect = "TRI"; // TRI విలువ నవీకరణ_డిస్ప్లే () తో స్ట్రింగ్ వేరియబుల్ను నవీకరించండి;// ప్రదర్శనను నవీకరించండి} time = మిల్లీస్ (); // సమయ వేరియబుల్ను నవీకరించండి}
తరువాత, డీబౌన్స్ ఆలస్యం తో అన్ని బటన్లను సెటప్ చేయడానికి అవసరమైన అన్ని కోడ్లను మేము నిర్వచిస్తాము. ఆర్టునో యొక్క అనలాగ్ పిన్లకు బటన్లు అనుసంధానించబడినందున, అనలాగ్ రీడ్ విలువ 30 కన్నా తక్కువకు చేరుకుంటే బటన్ ప్రెస్ను గుర్తించడానికి మేము అనలాగ్ రీడ్ కమాండ్ను ఉపయోగిస్తున్నాము, అప్పుడు మేము దాని విజయవంతమైన బటన్ ప్రెస్ను గుర్తించాము మరియు 200 ఎంఎస్ల వరకు వేచి ఉంటాము ఇది అసలు బటన్ ప్రెస్ లేదా శబ్దం మాత్రమే కాదా అని తనిఖీ చేయండి. ఈ స్టేట్మెంట్ నిజమైతే, ఫంక్షన్ జనరేటర్ యొక్క Hz, Khz మరియు Mhz విలువలను సెట్ చేయడానికి ఉపయోగించే విలువలతో మేము బూలియన్ వేరియబుల్స్ ను కేటాయిస్తాము. తరువాత, మేము డిస్ప్లేని అప్డేట్ చేస్తాము మరియు టైమ్ వేరియబుల్ని అప్డేట్ చేస్తాము. ఆర్డునోతో అనుసంధానించబడిన నాలుగు బటన్ల కోసం మేము అలా చేస్తాము.
if (అనలాగ్ రీడ్ (SET_FREQUENCY_HZ) <30 && మిల్లీస్ () - సమయం> డీబౌన్స్) {set_frequency_hz = 1; // బూలియన్ విలువలను నవీకరించండి set_frequency_khz = 0; set_frequency_mhz = 0; update_display (); // ప్రదర్శన సమయాన్ని నవీకరించండి = మిల్లిస్ (); // సమయ వేరియబుల్ను నవీకరించండి} if (అనలాగ్ రీడ్ (SET_FREQUENCY_KHZ) <30 && మిల్లీస్ () - సమయం> డీబౌన్స్) {set_frequency_hz = 0; // బూలియన్ విలువలను నవీకరించండి set_frequency_khz = 1; set_frequency_mhz = 0; moduleFrequency = కౌంటర్ * 1000; update_display (); // ప్రదర్శన సమయాన్ని నవీకరించండి = మిల్లిస్ (); // సమయ వేరియబుల్ను నవీకరించండి} if (అనలాగ్ రీడ్ (SET_FREQUENCY_MHZ) <30 && మిల్లీస్ () - సమయం> డీబౌన్స్) {// డీబౌన్స్ ఆలస్యం అనలాగ్ పిన్ను తనిఖీ చేయండి set_frequency_hz = 0; // బూలియన్ విలువలను నవీకరించండి set_frequency_khz = 0; set_frequency_mhz = 1; moduleFrequency = కౌంటర్ * 1000000; update_display ();// ప్రదర్శన సమయాన్ని నవీకరించండి = మిల్లిస్ (); // సమయ వేరియబుల్ను నవీకరించండి} if (అనలాగ్ రీడ్ (ENABLE_DISABLE_OUTPUT_PIN) <30 && మిల్లీస్ () - సమయం> డీబౌన్స్) {// అనవసరమైన పిన్ని డీబౌన్స్ ఆలస్యం తో తనిఖీ చేయండి btn_state =! btn_state; // బటన్ స్థితిని విలోమం చేయండి gen.EnableOutput (btn_state); // బటన్ స్థితిని బట్టి ఫంక్షన్ జెనరేటర్ యొక్క అవుట్పుట్ను ప్రారంభించండి / ఆపివేయి నవీకరణ_డిస్ప్లే (); // ప్రదర్శన సమయాన్ని నవీకరించండి = మిల్లిస్ (); // సమయ వేరియబుల్ నవీకరించండి}}// సమయ వేరియబుల్ను నవీకరించండి}}// సమయ వేరియబుల్ను నవీకరించండి}}
చివరగా, మన అప్డేట్_డిస్ప్లే () ఫంక్షన్ ఉంది. ఈ ఫంక్షన్లో, ఈ డిస్ప్లేని అప్డేట్ చేయడం కంటే మేము చాలా ఎక్కువ చేసాము ఎందుకంటే డిస్ప్లే యొక్క కొంత భాగాన్ని OLED లో అప్డేట్ చేయలేము. దీన్ని నవీకరించడానికి, మీరు దాన్ని కొత్త విలువలతో తిరిగి పూయాలి. ఇది కోడింగ్ ప్రక్రియను చాలా కష్టతరం చేస్తుంది.
ఈ ఫంక్షన్ లోపల, మేము డిస్ప్లేని క్లియర్ చేయడంతో ప్రారంభిస్తాము. తరువాత, మనకు అవసరమైన వచన పరిమాణాన్ని సెట్ చేస్తాము. ఆ తరువాత, మేము మా కర్సర్ మరియు ప్రింటెడ్ ఫంక్షన్ జనరేటర్ను display.println ("ఫంక్షన్ ఫంక్షన్") తో సెట్ చేసాము ; ఆదేశం. Display.setCursor (0, 20) ఫంక్షన్ సహాయంతో మేము మళ్ళీ టెక్స్ట్ పరిమాణాన్ని 2 కి మరియు కర్సర్ను (0,20) సెట్ చేసాము.
ఇది ఏ వేవ్ కోసం సమాచారాన్ని ప్రింట్ చేస్తుంది.
display.clearDisplay (); // మొదట డిస్ప్లే డిస్ప్లేను క్లియర్ చేయండి.సెట్టెక్స్ట్సైజ్ (1); // సెట్ టెక్స్ట్ సైజు display.setCursor (10, 0); // కర్సర్ స్థానం display.println ("ఫంక్షన్ జనరేటర్") సెట్ చేయండి; // టెక్స్ట్ display.setTextSize (2); // సెట్ టెక్స్ట్ సైజు display.setCursor (0, 20); // కర్సర్ స్థానాన్ని సెట్ చేయండి
తరువాత, మేము ఫ్రీక్వెన్సీ వివరాల కోసం బూలియన్ వేరియబుల్స్ ను తనిఖీ చేస్తాము మరియు మాడ్యూల్ ఫ్రీక్వెన్సీ వేరియబుల్ లో విలువను నవీకరిస్తాము. మేము దీన్ని Hz, kHz మరియు MHz విలువల కోసం చేస్తాము. తరువాత, మేము వేవ్ సెలెక్ట్ వేరియబుల్ ను తనిఖీ చేస్తాము మరియు ఏ వేవ్ ఎంచుకోబడిందో గుర్తిస్తాము. ఇప్పుడు, వేవ్ రకం మరియు ఫ్రీక్వెన్సీని సెట్ చేయడానికి మాకు విలువలు ఉన్నాయి.
if (set_frequency_hz == 1 && set_frequency_khz == 0 && set_frequency_mhz == 0) {// Hz లో ఫ్రీక్వెన్సీని సెట్ చేయడానికి బటన్ నొక్కితే తనిఖీ చేయండి మాడ్యూల్ ఫ్రీక్వెన్సీ = కౌంటర్; // ప్రస్తుత కౌంటర్ విలువతో మాడ్యూల్ ఫ్రీక్వెన్సీ వేరియబుల్ను నవీకరించండి} if (set_frequency_hz == 0 && set_frequency_khz == 1 && set_frequency_mhz == 0) K // KHz లో ఫ్రీక్వెన్సీని సెట్ చేయడానికి బటన్ నొక్కితే తనిఖీ చేయండి మాడ్యూల్ ఫ్రీక్వెన్సీ = కౌంటర్ * 1000; // ప్రస్తుత కౌంటర్ విలువతో మాడ్యూల్ ఫ్రీక్వెన్సీ వేరియబుల్ను అప్డేట్ చేయండి, అయితే దాన్ని KHZ లో సెట్ చేయడానికి 1000 ను గుణిస్తాము} if (set_frequency_hz == 0 && set_frequency_khz == 0 && set_frequency_mhz == 1) M // MHz లో ఫ్రీక్వెన్సీని సెట్ చేయడానికి బటన్ నొక్కితే తనిఖీ చేయండి = కౌంటర్ * 1000000; if (moduleFrequency> 12000000) {moduleFrequency = 12000000;// 12Mhz కౌంటర్ = 12; wave} if (waveSelect == "SIN") {// సైన్ వేవ్ ఎంచుకోబడింది display.println ("SIN"); gen.ApplySignal (SINE_WAVE, REG0, మాడ్యూల్ ఫ్రీక్వెన్సీ); సీరియల్.ప్రింట్ల్న్ (మాడ్యూల్ ఫ్రీక్వెన్సీ); } if (waveSelect == "SQR") {// Sqr వేవ్ display.println ("SQR") ఎంచుకోబడింది; gen.ApplySignal (SQUARE_WAVE, REG0, మాడ్యూల్ ఫ్రీక్వెన్సీ); సీరియల్.ప్రింట్ల్న్ (మాడ్యూల్ ఫ్రీక్వెన్సీ); } if (waveSelect == "TRI") {// ట్రై వేవ్ ఎంపిక చేయబడింది display.println ("TRI"); gen.ApplySignal (TRIANGLE_WAVE, REG0, మాడ్యూల్ ఫ్రీక్వెన్సీ); // AD9833 మాడ్యూల్ను నవీకరించండి. సీరియల్.ప్రింట్ల్న్ (మాడ్యూల్ ఫ్రీక్వెన్సీ); }} if (waveSelect == "SQR") {// Sqr వేవ్ display.println ("SQR") ఎంచుకోబడింది; gen.ApplySignal (SQUARE_WAVE, REG0, మాడ్యూల్ ఫ్రీక్వెన్సీ); సీరియల్.ప్రింట్ల్న్ (మాడ్యూల్ ఫ్రీక్వెన్సీ); } if (waveSelect == "TRI") {// ట్రై వేవ్ ఎంచుకోబడింది display.println ("TRI"); gen.ApplySignal (TRIANGLE_WAVE, REG0, మాడ్యూల్ ఫ్రీక్వెన్సీ); // AD9833 మాడ్యూల్ను నవీకరించండి. సీరియల్.ప్రింట్ల్న్ (మాడ్యూల్ ఫ్రీక్వెన్సీ); }} if (waveSelect == "SQR") {// Sqr వేవ్ display.println ("SQR") ఎంచుకోబడింది; gen.ApplySignal (SQUARE_WAVE, REG0, మాడ్యూల్ ఫ్రీక్వెన్సీ); సీరియల్.ప్రింట్ల్న్ (మాడ్యూల్ ఫ్రీక్వెన్సీ); } if (waveSelect == "TRI") {// ట్రై వేవ్ ఎంచుకోబడింది display.println ("TRI"); gen.ApplySignal (TRIANGLE_WAVE, REG0, మాడ్యూల్ ఫ్రీక్వెన్సీ); // AD9833 మాడ్యూల్ను నవీకరించండి. సీరియల్.ప్రింట్ల్న్ (మాడ్యూల్ ఫ్రీక్వెన్సీ); }
మేము మళ్ళీ కర్సర్ను సెట్ చేసి కౌంటర్ విలువలను నవీకరిస్తాము. డిస్ప్లేలో ఫ్రీక్వెన్సీ పరిధిని నవీకరించడానికి మేము మళ్ళీ బూలియన్ను తనిఖీ చేస్తాము, OLED యొక్క పని సూత్రం చాలా విచిత్రమైనది కనుక మనం దీన్ని చేయాలి.
display.setCursor (45, 20); display.println (కౌంటర్); // ప్రదర్శనలో కౌంటర్ సమాచారాన్ని ముద్రించండి. if (set_frequency_hz == 1 && set_frequency_khz == 0 && set_frequency_mhz == 0) {display.setCursor (90, 20); display.println ("Hz"); డిస్ప్లే డిస్ప్లేలో // ప్రింట్ Hz.display (); // అన్ని సెట్లు ప్రదర్శనను నవీకరించినప్పుడు} if (set_frequency_hz == 0 && set_frequency_khz == 1 && set_frequency_mhz == 0) {display.setCursor (90, 20); display.println ("Khz"); display.display (); // అన్ని సెట్లు ప్రదర్శనను నవీకరించినప్పుడు} if (set_frequency_hz == 0 && set_frequency_khz == 0 && set_frequency_mhz == 1) {display.setCursor (90, 20); display.println ("Mhz"); display.display (); // అన్ని సెట్లు ప్రదర్శనను నవీకరించినప్పుడు}
తరువాత, అవుట్పుట్ను / అవుట్పుట్ను OLED కి ప్రింట్ చేయడానికి బటన్ ప్రెస్ వేరియబుల్ ను తనిఖీ చేస్తాము. OLED మాడ్యూల్ కారణంగా మళ్ళీ ఇది అవసరం.
(btn_state) {display.setTextSize (1); display.setCursor (65, 45); display.print ("అవుట్పుట్ ఆన్"); డిస్ప్లే డిస్ప్లేకి // ప్రింట్ అవుట్పుట్. డిస్ప్లే (); display.setTextSize (2); } else {display.setTextSize (1); display.setCursor (65, 45); display.print ("అవుట్పుట్ ఆఫ్"); // డిస్ప్లే డిస్ప్లేకి అవుట్పుట్ ప్రింట్. డిస్ప్లే (); display.setTextSize (2); }
ఇది మా కోడింగ్ ప్రక్రియ ముగింపును సూచిస్తుంది. ఈ సమయంలో మీరు గందరగోళంలో ఉంటే, మరింత అవగాహన కోసం మీరు కోడ్లోని వ్యాఖ్యలను తనిఖీ చేయవచ్చు.
AD9833 బేస్డ్ ఫంక్షన్ జనరేటర్ను పరీక్షిస్తోంది
సర్క్యూట్ పరీక్షించడానికి, పై సెటప్ ఉపయోగించబడుతుంది. మీరు గమనిస్తే, మేము 12V DC పవర్ అడాప్టర్ను DC బారెల్ జాక్తో అనుసంధానించాము మరియు మేము హాంటెక్ ఓసిల్లోస్కోప్ను సర్క్యూట్ యొక్క అవుట్పుట్కు అనుసంధానించాము. అవుట్పుట్ ఫ్రీక్వెన్సీని దృశ్యమానం చేయడానికి మరియు కొలవడానికి మేము ల్యాప్టాప్కు ఓసిల్లోస్కోప్ను కనెక్ట్ చేసాము.
ఇది పూర్తయిన తర్వాత, మేము రోటరీ ఎన్కోడర్ సహాయంతో అవుట్పుట్ ఫ్రీక్వెన్సీని 5Khz కు సెట్ చేసాము మరియు మేము అవుట్పుట్ సైన్ వేవ్ ను పరీక్షిస్తాము మరియు తగినంత ఖచ్చితంగా, ఇది అవుట్పుట్ వద్ద 5Khz సైన్ వేవ్.
తరువాత, మేము అవుట్పుట్ తరంగ రూపాన్ని త్రిభుజాకార తరంగా మార్చాము, కానీ ఫ్రీక్వెన్సీ అదే విధంగా ఉంది, అవుట్పుట్ తరంగ రూపం క్రింద చూపబడింది.
అప్పుడు మేము అవుట్పుట్ను చదరపు తరంగా మార్చాము మరియు అవుట్పుట్ను గమనించాము మరియు ఇది ఖచ్చితమైన చదరపు తరంగం.
మేము ఫ్రీక్వెన్సీ శ్రేణులను కూడా మార్చాము మరియు అవుట్పుట్ను పరీక్షించాము మరియు ఇది బాగా పనిచేస్తోంది.
మరింత మెరుగుదలలు
ఈ సర్క్యూట్ భావన యొక్క రుజువు మాత్రమే మరియు మరింత మెరుగుదలలు అవసరం. మొదట, అవుట్పుట్ కోసం మాకు మంచి నాణ్యత గల పిసిబి మరియు కొన్ని మంచి నాణ్యత గల బిఎన్సి కనెక్టర్ అవసరం లేకపోతే మనం ఎక్కువ పౌన.పున్యాన్ని పొందలేము. మాడ్యూల్ యొక్క వ్యాప్తి చాలా తక్కువగా ఉంది, కాబట్టి దాన్ని మెరుగుపరచడానికి, అవుట్పుట్ వోల్టేజ్ను విస్తరించడానికి మాకు కొన్ని ఆప్-ఆంప్ సర్క్యూట్లు అవసరం. అవుట్పుట్ వ్యాప్తిని మార్చడానికి ఒక పొటెన్షియోమీటర్ను అనుసంధానించవచ్చు. సిగ్నల్ను ఆఫ్సెట్ చేయడానికి ఒక స్విచ్ కనెక్ట్ చేయవచ్చు; ఇది తప్పనిసరిగా కలిగి ఉండవలసిన లక్షణం. ఇంకా, కోడ్ కొంచెం బగ్గీ అయినందున చాలా మెరుగుదల అవసరం. చివరగా, OLED డిస్ప్లేలను మార్చాల్సిన అవసరం ఉంది లేకపోతే సులభంగా అర్థమయ్యే కోడ్ రాయడం అసాధ్యం.
ఇది ఈ ట్యుటోరియల్ ముగింపును సూచిస్తుంది, మీరు వ్యాసాన్ని ఇష్టపడ్డారని మరియు క్రొత్తదాన్ని నేర్చుకున్నారని నేను ఆశిస్తున్నాను. వ్యాసానికి సంబంధించి మీకు ఏవైనా ప్రశ్నలు ఉంటే, మీరు వాటిని క్రింది వ్యాఖ్య విభాగంలో ఉంచవచ్చు లేదా మీరు మా ఎలక్ట్రానిక్స్ ఫోరమ్ను ఉపయోగించవచ్చు.