2017年5月27日 星期六

STM32F0 ADC calibration

如果有需要把ADC做準的話,需要先從MCU的SPEC開始K起……
!!!!!!!!!
有沒有這麼複雜?
看起來有喔!

先看一下介紹,如果不需要做很準的情況下,只要把ADC讀出來即可,但如果需要做準的話,除了VDDA需要注意,STM32F0需要注意internal reference voltage, 被放在channel 17的位置上

實際上的VDDA需要透過2個參數來進行校正:Vreferint_cal還有Vrefint_data, Vreferint_cal由MCU的內部ROM讀出,Vrefint_data就由ADC ch17 讀出,如下圖的公式


Vrefint_data的內部ROM值落在這裡,程式可以用(*(uint16_t*)0x1FFFF7BA)的方式取出

可以確認一下 internal reference voltage的情況


實測的結果:看起來還有一個固定的offset 存在

offset 目前是想在ADC上墊個固定offset,再把這個offet拉到一組ADC上,讀到的電壓減去offset,應該就可以消掉這個問題了!
待續……

STM32 Vbus sensing

在比較高階的STM的USB控制上,他有Vbus sensing的功能,他的功能主要是為了做安規上的控制:  假設device 自帶電源(self power),這樣如果一直讓D+ pull high的話,這樣USB connector的D+的地方就會有電,這樣安規會驗不過,所以比較好的做法就是偵測USB Vbus 是否有進來,假設Vbus 有進來的話,再把D+ pull high即可。
在沒有Vbus sensing的做法,就要靠電阻分壓,再利用GPIO 外部中斷來偵測,firmware偵測到Vbus進來後,自行控制D+ pull high的時機:

在有Vbus sensing的MCU上,只要將Vbus 接上PA9 Vbus sensing 的腳位上,並在程式initial 的時後啟動這個功能, 那麼MCU內部的hardware就會自動偵測Vbus 並且決定D+ pull high or not。
在SEPC裡面有說,如果需要開啟Vbus sensing的功能,就需要200uA的基本耗電,在有battery life 上,200uA其實不小。
Vbus 判斷的準位為4.25V


最後hardware上,請記得加裝ESD保護。 

或是選用USBUF,這顆是在Vbus多加一顆zener diode 防止Vbus 突波,功能就是over voltage protection。

假設USB device 是由USB 提供電源(BUS power),那就不需要考慮這個問題了XDDDD


2017年3月24日 星期五

[MCU] STM32/EFM32 small C interpreter for scripting

網路上有用MCU 實作小型的 C interpreter for scripting. 有興趣可以研究一下。


有幾個值得注意的地方:

\ports\library_common.c  ç 自定LIBRARY

EMBEDDED_HOST ç 為主要的MACRO

\ports\STM32\platform_stm32.c   ç  library和底層相關的code


值得注意的是,佔用了很大的HEAP      #define HEAP_SIZE (48*1024)        /* space for the heap and the stack */


2017年3月17日 星期五

[視窗介面] VC++ object array

最近在寫visual studio c++ windows 程式, 以前就是一個物件一個程式,但後來覺得相同的物件應該可以寫成陣列的方式了,這樣管理起來也比較方便,研究了一下:
1、button event:
private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {
    Button^ thisBox = safe_cast<Button^>(sender);
    textBox2->Text = thisBox->Text;
}
2、radioButton:
比較高級的寫法
private: System::Void radioButton4_CheckedChanged(System::Object^  sender, System::EventArgs^  e) {

     array<RadioButton ^, 2>^buttons = { { radioButton4, radioButton5, radioButton6 },{ radioButton7, radioButton8, radioButton9 } };

     int i;
     for (i = 0; i < 3; i++) {
         if (buttons[0,i]->Checked) textBox3->Text = "Group1OK" + i.ToString();
     }
     for (i = 0; i < 3; i++) {
         if (buttons[1, i]->Checked) textBox2->Text = "Group2OK" + i.ToString();
     }
}

更高級的寫法
private: System::Void radioButton4_CheckedChanged(System::Object^  sender, System::EventArgs^  e) {

     array<RadioButton ^, 2>^buttons = { { radioButton4, radioButton5, radioButton6 },{ radioButton7, radioButton8, radioButton9 } };
     array<TextBox ^>^textboxs = { textBox3, textBox2 };

     int i,j;
     for (j = 0; j < 2; j++) {
         for (i = 0; i < 3; i++) {
              if (buttons[j,i]->Checked) textboxs[j]->Text = "Group" + j.ToString() + "OK" +i.ToString();
         }
     }
}


2017年3月10日 星期五

[案件] 518接案心得

和同事在518創了帳號, 這次試試看主動出擊是否會有效果, 不過這2個月下來的心得:
1、case不多
2、就算和業主接洽了一段時間並且報價後,就沒有下文了。

註:
為了可以不要浪費太多時間在找案件上,寫了一個簡單的爬蟲程式來check 是否有新案件登入