那曲檬骨新材料有限公司

電子發(fā)燒友App

硬聲App

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示
創(chuàng)作
電子發(fā)燒友網(wǎng)>電子資料下載>電子資料>微型能源轉(zhuǎn)型第2部分之軟件介紹

微型能源轉(zhuǎn)型第2部分之軟件介紹

2023-06-19 | zip | 0.00 MB | 次下載 | 免費(fèi)

資料介紹

描述

上周,我們討論了“微型能源轉(zhuǎn)換”演示的硬件。本周我們將介紹軟件。對(duì)于那些關(guān)注過我以前的項(xiàng)目的人,您可能會(huì)知道我傾向于關(guān)注事物的教學(xué)方面,而不是代碼效率。對(duì)于 Arduino Mega,這通常不是什么大問題。因此,我傾向于僅使用 C++ 對(duì)象將代碼拆分為功能模塊,如下圖所示:

pYYBAGOIFYmASle-AABGuX8B_fE683.png
模塊化架構(gòu)
?

這些模塊中的大多數(shù)將具有一個(gè)setup()和一個(gè)loop()功能,這些功能在層次結(jié)構(gòu)更高層的模塊的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;
   }
 }
}

很明顯,該架構(gòu)大致遵循模型-視圖-控制器 (MVC) 模式, Adafruit 的 2.8 英寸 LCD 屏幕使用向?qū)?/font>我將在下一篇博客中介紹這部分內(nèi)容。

現(xiàn)在我們將專注于模型;中斷主要用于創(chuàng)建一個(gè)穩(wěn)定的 0.1 秒(秒和分鐘)計(jì)時(shí)器,用于為電機(jī)提供穩(wěn)定的類似 PWM 的輸出,因?yàn)樗鼈冞B接到多路復(fù)用器,而不是直接連接到輸出阿杜諾。

 //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;
}

粗略地說,該模型由三類模塊組成:

  • 環(huán)境,包括時(shí)間(日歷)和天氣模擬
  • 輸入和輸出,讀取太陽能電池板并控制 LED 和電機(jī)
  • 公園布局,將輸入和輸出重新計(jì)算為對(duì)實(shí)際太陽能公園有意義的數(shù)字。

大多數(shù)這些模塊都相當(dāng)簡(jiǎn)單,所以我不會(huì)深入研究代碼本身。唯一需要注意的是SparkFun 的兩個(gè) 16 通道模擬/數(shù)字多路復(fù)用器,一個(gè)用于輸入(太陽能電池板),一個(gè)用于輸出(LED 和電機(jī))。多路復(fù)用器非常適合輸入,因此太陽能電池板的代碼非常簡(jiǎn)單:

 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;
}

遺憾的是,這些多路復(fù)用器沒有鎖存功能,因此它們不太適合輸出,至少在我們這里使用它們的方式上是這樣。基本上它們一次只能控制一個(gè)輸出,因此組合多個(gè)輸出需要您非??焖俚氐鼈?,并且接受您想要的輸出越多,最大輸出將必須由所有輸出共享。對(duì)于電機(jī)來說,這不是一個(gè)大問題,因?yàn)樗鼈儫o論如何都必須緩慢轉(zhuǎn)動(dòng),并且附加質(zhì)量的慣性允許某種脈沖寬度調(diào)制 (PWM)類方法,其中各種電機(jī)將其所需的輸出分配給總時(shí)間(一秒)。這需要由中斷處理程序來控制(另見上面的代碼):

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++;
 }
} 

由于這些限制,決定僅在電機(jī)關(guān)閉時(shí)運(yùn)行 LEDS,而不是同時(shí)運(yùn)行太多。這些由 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;
   }
 }
}

?


下載該資料的人也在下載 下載該資料的人還在閱讀
更多 >

評(píng)論

查看更多

下載排行

本周

  1. 1山景DSP芯片AP8248A2數(shù)據(jù)手冊(cè)
  2. 1.06 MB  |  532次下載  |  免費(fèi)
  3. 2RK3399完整板原理圖(支持平板,盒子VR)
  4. 3.28 MB  |  339次下載  |  免費(fèi)
  5. 3TC358743XBG評(píng)估板參考手冊(cè)
  6. 1.36 MB  |  330次下載  |  免費(fèi)
  7. 4DFM軟件使用教程
  8. 0.84 MB  |  295次下載  |  免費(fèi)
  9. 5元宇宙深度解析—未來的未來-風(fēng)口還是泡沫
  10. 6.40 MB  |  227次下載  |  免費(fèi)
  11. 6迪文DGUS開發(fā)指南
  12. 31.67 MB  |  194次下載  |  免費(fèi)
  13. 7元宇宙底層硬件系列報(bào)告
  14. 13.42 MB  |  182次下載  |  免費(fèi)
  15. 8FP5207XR-G1中文應(yīng)用手冊(cè)
  16. 1.09 MB  |  178次下載  |  免費(fèi)

本月

  1. 1OrCAD10.5下載OrCAD10.5中文版軟件
  2. 0.00 MB  |  234315次下載  |  免費(fèi)
  3. 2555集成電路應(yīng)用800例(新編版)
  4. 0.00 MB  |  33566次下載  |  免費(fèi)
  5. 3接口電路圖大全
  6. 未知  |  30323次下載  |  免費(fèi)
  7. 4開關(guān)電源設(shè)計(jì)實(shí)例指南
  8. 未知  |  21549次下載  |  免費(fèi)
  9. 5電氣工程師手冊(cè)免費(fèi)下載(新編第二版pdf電子書)
  10. 0.00 MB  |  15349次下載  |  免費(fèi)
  11. 6數(shù)字電路基礎(chǔ)pdf(下載)
  12. 未知  |  13750次下載  |  免費(fèi)
  13. 7電子制作實(shí)例集錦 下載
  14. 未知  |  8113次下載  |  免費(fèi)
  15. 8《LED驅(qū)動(dòng)電路設(shè)計(jì)》 溫德爾著
  16. 0.00 MB  |  6656次下載  |  免費(fèi)

總榜

  1. 1matlab軟件下載入口
  2. 未知  |  935054次下載  |  免費(fèi)
  3. 2protel99se軟件下載(可英文版轉(zhuǎn)中文版)
  4. 78.1 MB  |  537798次下載  |  免費(fèi)
  5. 3MATLAB 7.1 下載 (含軟件介紹)
  6. 未知  |  420027次下載  |  免費(fèi)
  7. 4OrCAD10.5下載OrCAD10.5中文版軟件
  8. 0.00 MB  |  234315次下載  |  免費(fèi)
  9. 5Altium DXP2002下載入口
  10. 未知  |  233046次下載  |  免費(fèi)
  11. 6電路仿真軟件multisim 10.0免費(fèi)下載
  12. 340992  |  191187次下載  |  免費(fèi)
  13. 7十天學(xué)會(huì)AVR單片機(jī)與C語言視頻教程 下載
  14. 158M  |  183279次下載  |  免費(fèi)
  15. 8proe5.0野火版下載(中文版免費(fèi)下載)
  16. 未知  |  138040次下載  |  免費(fèi)
百家乐路单免费下载| 百家乐官网赌场娱乐| 方形百家乐筹码| 免费百家乐官网统计| 大同市| 百家乐游戏教程| 百家乐官网www| 皇冠娱乐| 蓝盾百家乐官网代理打| 大化| 百家乐怎么骗人| 怎样打百家乐官网的玩法技巧和规则 | 百家乐优惠高的网址| 澳门百家乐官网怎赌才能赚钱| 大发888手机版下载官方网站| 百家乐平台信誉排名| 百家乐官网揽子打法| 362娱乐城开户| 高尔夫百家乐的玩法技巧和规则| 百家乐官网代理| 澳门1百家乐官网网| 六合彩开奖现场| 金三角百家乐的玩法技巧和规则 | 六合彩网站| 百威百家乐的玩法技巧和规则| 嘉禾百家乐官网的玩法技巧和规则 | 百家乐官网微笑投注| 赌博运气| 大发888娱乐厂场| 御金百家乐娱乐城| 神话百家乐官网的玩法技巧和规则| 大发888游戏官网| 凯旋门百家乐游戏| 蓝盾百家乐官网洗码| 百家乐官网试玩平台| 娱网棋牌大厅下载| 大众百家乐的玩法技巧和规则| 百家乐官网免费改单| 百家乐官网看炉子的方法| 娱乐城注册送38| 网页棋牌游戏|