發表文章

利用STM32 開發LED量測裝置-2

利用 STM32 開發 LED 量測裝置 -2 前文有提到利用 TCS3200   顏色識別可以得到 RGB 的三個分量,而利用 RGB 的三個分量來得到 KED 的顏色則是用 CIE1931 色度空間才判定,關於 CIE 1931 的文件可參考 WIKI 的網址 http://zh.wikipedia.org/wiki/CIE1931CIE1931 色彩空间 ( 基於智慧財權問題,圖及文件不轉載 )     利用 TCS3200得到 r,g,b的比例值依下列公式換算出R,G,B的值, R=r/(r+g+b) G=g/(r+g+b) B=b/(r+g+b)  其中 R+G+B=1 RGB 的三個分量 的轉換公式如下。 X = R * 0.4124 + G * 0.3576 + B * 0.1805 Y = R * 0.2126 + G * 0.7152 + B * 0.0722 Z = R * 0.0193 + G * 0.1192 + B * 0.9505 最後得到的 X,Y,Z 值需在做一次色域觀換,其值如下 X = X / 0.95047        ' 'Y = Y / 1 Z = Z / 1.08883 在實用上,我們只需要知道, X,Y 的值即可,因 X 代表紅的程度,而 Y 代表綠的程度。 在解得X,Y的值後參考CIE1931色域座標,即可得到LED的顏色。 在實際應用上,我想可能會碰到一些應用上的問題,網友們如有應用上的問題可以留言給我。 下面是網路可以找到的波長和 X,Y,Z值的相關值。供大家參考。 CIE 1931 Colorimetric System Spectral Tristimulus Values Defining CIE 1931  Chromaticity Coordinated Derived from them     ================================  Wave-      Chromaticity ...

STM32 讀取 BQ27541 電量

圖片
STM32 讀取 BQ27541 這是個人最近所接到的案子,要讀取電池包中的SOC,花了幾天終於完成了經驗總結如下: TI bq27541 datasheet 對I2C介面的讀取如下圖,                                                                         圖1  我要採用的是(c) 1 byte-read, 用的是ST 範例程式 M24C08 EEPROM讀取的範例來寫: 用的是 MultiByteRead中這函式來讀取。 main 中用的是 I2C_EE_MultiByteRead(Rx1 ,0x2c, u16 NumByteToRead)   註 0x2c 是BQ27541讀取 SOC            而圖1 的時序我把它拆成下面七個步驟 Host Generated   指令 Fuel Gauge Generated 1 Start, I2C_GenerateSTART(I2C1, ENABLE);   while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));  2 ADDR[6:0] 0 I2C_Send7bitAddress(I2C1, 0xaa, I2C_Direction_Transmitter);       Acknowledge while(!I2C_Che...

STM32 NVIC

在 ST 所提供的範例我們可以看到三大設定, RCC 、 NVIC 、 GPIO ,如下所示: /* System Clocks Configuration */   RCC_Configuration();          /* NVIC configuration */   NVIC_Configuration();   /* Configure the GPIO ports */   GPIO_Configuration(); RCC 和 GPIO 己略介紹過,而 NVIC 在本章將簡單介紹一下。 NVIC 是對中斷優先的管理,首先看在 ST 所提供的範例 USART 中的 DMA_Polling 中 void NVIC_Configuration(void) {  #ifdef  VECT_TAB_RAM    /* Set the Vector Table base location at 0x20000000 */   NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0); #else  /* VECT_TAB_FLASH  */   /* Set the Vector Table base location at 0x08000000 */   NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);   #endif } 接著看 USART  Interrupt 的範例中 NVIC 副程式 void NVIC_Configuration(void) {   NVIC_InitTypeDef NVIC_InitStructure; #ifdef  VECT_TAB_RAM    /* Set the Vector Table base location at 0x20000000 */ ...