資料介紹
描述
上周,我們討論了“微型能源轉換”演示的硬件。本周我們將介紹軟件。對于那些關注過我以前的項目的人,您可能會知道我傾向于關注事物的教學方面,而不是代碼效率。對于 Arduino Mega,這通常不是什么大問題。因此,我傾向于僅使用 C++ 對象將代碼拆分為功能模塊,如下圖所示:
這些模塊中的大多數將具有一個setup()
和一個loop()
功能,這些功能在層次結構更高層的模塊的setup()
和中使用。loop()
頂層(能量)演示了這種方法:
...
#include "Wizard.h"
#include "Interrupts.h"
#include "Model.h"
...
static Interrupts interrupt;
static Wizard wizard;
static Model model;
...
void setup() {
Serial.begin(9600);
Serial.println(F("SETUP ENERGY TRANSITION DEMO"));
interrupt.setup();
model.setup();
wizard.setup();
...
}
void loop() {
wizard.loop();
if ( interrupt.getSecondsFlank()) {
interrupt.clear();
...
switch ( balance ) {
case 0:
wizard.update();
break;
case 1:
...
break;
default:
break;
}
}
}
很明顯,該架構大致遵循模型-視圖-控制器 (MVC) 模式, Adafruit 的 2.8 英寸 LCD 屏幕使用向導。我將在下一篇博客中介紹這部分內容。
現在我們將專注于模型;中斷主要用于創建一個穩定的 0.1 秒(秒和分鐘)計時器,用于為電機提供穩定的類似 PWM 的輸出,因為它們連接到多路復用器,而不是直接連接到輸出阿杜諾。
//Activate interrupt Timer2 (0.1 sec)
ISR(TIMER2_COMPA_vect) {
loopCounter++;
motors.handleInterrupt(200);
lights.handleInterrupt();
interrupt.flank = true;
if ( interrupt.getLock() )
return;
int_counter++;
int_counter %= SECONDS;
if ( int_counter == 0 )
interrupt.sec_flank = true;
else
return;
interrupt.min_flank = false;
interrupt.tensec_flank = false;
min_counter++;
interrupt.checkInitialisation();
min_counter %= MINUTES;
if ( min_counter == 0)
interrupt.min_flank = true;
if (( min_counter % TEN_SEC ) == 0)
interrupt.tensec_flank = true;
}
粗略地說,該模型由三類模塊組成:
- 環境,包括時間(日歷)和天氣模擬器
- 輸入和輸出,讀取太陽能電池板并控制 LED 和電機
- 公園布局,將輸入和輸出重新計算為對實際太陽能公園有意義的數字。
大多數這些模塊都相當簡單,所以我不會深入研究代碼本身。唯一需要注意的是SparkFun 的兩個 16 通道模擬/數字多路復用器,一個用于輸入(太陽能電池板),一個用于輸出(LED 和電機)。多路復用器非常適合輸入,因此太陽能電池板的代碼非常簡單:
Solar::Solar() {}
void Solar::setup( int smpl) {
pinMode(A15, INPUT);
for ( int i = 0; i < 3; i++) {
pinMode(SS0 + i, OUTPUT);
digitalWrite(SS0 + i, LOW);
}
samples = smpl;
counter = 0;
}
uint16_t Solar::read(byte number) {
switch ( number ) {
case 0:
digitalWrite(SS0, LOW);
digitalWrite(SS1, LOW);
digitalWrite(SS2, LOW);
digitalWrite(SS3, LOW);
break;
case 1:
digitalWrite(SS0, HIGH);
digitalWrite(SS1, LOW);
digitalWrite(SS2, LOW);
digitalWrite(SS3, LOW);
break;
case 2:
digitalWrite(SS0, LOW);
digitalWrite(SS1, HIGH);
digitalWrite(SS2, LOW);
digitalWrite(SS3, LOW);
break;
case 3:
digitalWrite(SS0, HIGH);
digitalWrite(SS1, HIGH);
digitalWrite(SS2, LOW);
digitalWrite(SS3, LOW);
break;
case 4:
digitalWrite(SS0, LOW);
digitalWrite(SS1, LOW);
digitalWrite(SS2, HIGH);
digitalWrite(SS3, LOW);
break;
case 5:
digitalWrite(SS0, HIGH);
digitalWrite(SS1, LOW);
digitalWrite(SS2, HIGH);
digitalWrite(SS3, LOW);
break;
case 6:
digitalWrite(SS0, LOW);
digitalWrite(SS1, HIGH);
digitalWrite(SS2, HIGH);
digitalWrite(SS3, LOW);
break;
case 7:
digitalWrite(SS0, HIGH);
digitalWrite(SS1, HIGH);
digitalWrite(SS2, HIGH);
digitalWrite(SS3, LOW);
break;
case 8:
digitalWrite(SS0, LOW);
digitalWrite(SS1, LOW);
digitalWrite(SS2, LOW);
digitalWrite(SS3, HIGH);
break;
case 15:
digitalWrite(SS0, HIGH);
digitalWrite(SS1, HIGH);
digitalWrite(SS2, HIGH);
digitalWrite(SS3, HIGH);
break;
default:
digitalWrite(A15, LOW);
digitalWrite(SS0, LOW);
digitalWrite(SS1, LOW);
digitalWrite(SS2, LOW);
digitalWrite(SS3, LOW);
break;
}
int result = 0;
for ( int i = 0; i < samples; i++) {
delay( READ_DELAY );
result += analogRead(A15);
}
values[number]=result/samples;
return values[number];
}
uint16_t Solar::get(byte number) {
return values[number];
}
void Solar::loop() {
read( counter++ );
counter%=NR_OF_PANELS;
}
遺憾的是,這些多路復用器沒有鎖存功能,因此它們不太適合輸出,至少在我們這里使用它們的方式上是這樣。基本上它們一次只能控制一個輸出,因此組合多個輸出需要您非常快速地迭代它們,并且接受您想要的輸出越多,最大輸出將必須由所有輸出共享。對于電機來說,這不是一個大問題,因為它們無論如何都必須緩慢轉動,并且附加質量的慣性允許某種脈沖寬度調制 (PWM)類方法,其中各種電機將其所需的輸出分配給總時間(一秒)。這需要由中斷處理程序來控制(另見上面的代碼):
void Motors::handleInterrupt( uint16_t total ) {
if (!enable)
return;
uint16_t results[3];
calcSpeed( results, total );
if ( counter < results[0]) {
if ( results[0] > 0 ) {
motor(WALRUS, HIGH);
}
} else if ( counter < results[0] + results[1] ) {
if ( results[1] > 0 ) {
motor(WATERMILL, HIGH);
}
} else if ( counter < results[0] + results[1] + results[2]) {
if ( results[2] > 0 ) {
motor(WINDMILL, HIGH);
}
}
if ( counter >= total ) {
motor(WALRUS, LOW);
motor(WATERMILL, LOW);
motor(WINDMILL, LOW);
counter = 0;
} else {
counter++;
}
}
由于這些限制,決定僅在電機關閉時運行 LEDS,而不是同時運行太多。這些由 16 位掩碼控制:
void Lights::handleInterrupt() {
if (!enable)
return;
uint16_t shift = 1;
if ( mask == 0 ) {
led(15, LOW);
} else {
for (int i = 0; i < 7; i++) {
bool result = shift & mask;
if ( result )
led(i, result);
shift <<= 1;
}
}
}
?
- 電源設計方法-第2部分
- 使用AWS的IoT環境站第2部分
- EN 62272-2-2007 全球數字無線廣播(DRM).第2部分 0次下載
- 電氣過應力簡介-第2部分
- 了解你的電池組:第2部分
- LDO基礎知識:噪聲 - 第2部分
- 用電信息采集系統型式規范第2部分 1次下載
- 用電信息采集系統技術規范第2部分 3次下載
- 用電信息采集系統檢驗規范第2部分 0次下載
- 用電信息采集系統通信協議第2部分 3次下載
- 電壓基準如何影響ADC性能,第2部分 10次下載
- 了解天線規格和操作,第2部分 6次下載
- 電動汽車傳導充電用連接裝置第2部分:交流充電接口 44次下載
- 第2部分-數據模塊編碼和信息控制編碼 8次下載
- 移動多媒體廣播 第2部分:復用GY T 220[1].2-2
- ADC數字下變頻器:抽取濾波器和ADC混疊,第2部分 1455次閱讀
- ADI公司設計工具:ADIsimRF第2部分 948次閱讀
- ADC眼中的虛擬評估,第2部分 624次閱讀
- 邊緣智能第1部分:邊緣節點 1046次閱讀
- 介紹ADC寄存器的讀取 2026次閱讀
- 實時控制技術滿足實時工業通信發展的需求 —— 第2部分 993次閱讀
- JESD204C入門第2部分:新特性及其內容 6242次閱讀
- DC/DC轉換器傳導EMI - 第2部分,噪聲傳播和濾波 3150次閱讀
- 德國能源轉型:從1.0到4.0 5254次閱讀
- 電壓檢測器、監控器和高級監控各種功能介紹:第1部分 4859次閱讀
- 幾種微型傳感器件的結構和原理詳細介紹 1.7w次閱讀
- nixie微型無人機的功能介紹_nixie微型無人機多少錢 1.3w次閱讀
- 無源元件并非真的“無源”:第1部分——電容 2433次閱讀
- 驅動LED串的DCM升壓轉換器簡化分析(2):實際考慮 1471次閱讀
- 混合信號系統接地揭秘之第二部分 1663次閱讀
下載排行
本周
- 1山景DSP芯片AP8248A2數據手冊
- 1.06 MB | 532次下載 | 免費
- 2RK3399完整板原理圖(支持平板,盒子VR)
- 3.28 MB | 339次下載 | 免費
- 3TC358743XBG評估板參考手冊
- 1.36 MB | 330次下載 | 免費
- 4DFM軟件使用教程
- 0.84 MB | 295次下載 | 免費
- 5元宇宙深度解析—未來的未來-風口還是泡沫
- 6.40 MB | 227次下載 | 免費
- 6迪文DGUS開發指南
- 31.67 MB | 194次下載 | 免費
- 7元宇宙底層硬件系列報告
- 13.42 MB | 182次下載 | 免費
- 8FP5207XR-G1中文應用手冊
- 1.09 MB | 178次下載 | 免費
本月
- 1OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費
- 2555集成電路應用800例(新編版)
- 0.00 MB | 33566次下載 | 免費
- 3接口電路圖大全
- 未知 | 30323次下載 | 免費
- 4開關電源設計實例指南
- 未知 | 21549次下載 | 免費
- 5電氣工程師手冊免費下載(新編第二版pdf電子書)
- 0.00 MB | 15349次下載 | 免費
- 6數字電路基礎pdf(下載)
- 未知 | 13750次下載 | 免費
- 7電子制作實例集錦 下載
- 未知 | 8113次下載 | 免費
- 8《LED驅動電路設計》 溫德爾著
- 0.00 MB | 6656次下載 | 免費
總榜
- 1matlab軟件下載入口
- 未知 | 935054次下載 | 免費
- 2protel99se軟件下載(可英文版轉中文版)
- 78.1 MB | 537798次下載 | 免費
- 3MATLAB 7.1 下載 (含軟件介紹)
- 未知 | 420027次下載 | 免費
- 4OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費
- 5Altium DXP2002下載入口
- 未知 | 233046次下載 | 免費
- 6電路仿真軟件multisim 10.0免費下載
- 340992 | 191187次下載 | 免費
- 7十天學會AVR單片機與C語言視頻教程 下載
- 158M | 183279次下載 | 免費
- 8proe5.0野火版下載(中文版免費下載)
- 未知 | 138040次下載 | 免費
評論
查看更多