2014年10月11日 星期六

Attiny + PGA2311 音量控制器 第二版



突然發現好久沒發文了,作品生產率有點低,所以趕快把這個做完拿來貼
這次把耳機接頭的放回PCB板子上,佔了不少面積...
另外就是修正VR的線路沒接到的問題,還有就是這次VR的孔位特別預留了更大的位置,然後其他的部分不變,架構上一樣是一個OPA Buffer給PGA2311再用Attiny控制PGA2311這樣

至於為啥正負電壓產生器不放上去....
一來是沒啥地方放,二是就算把PCB加大面積,這種Charge pump的東西也是有一定的噪音在,要如何和OPA線路隔離也是種考驗,所以除非我找到一個迷你的Charge pump IC,而且夠力,還有好的小電容再說吧


#define PGA_ZCEN_PIN    3
#define PGA_CS_PIN      1
#define PGA_SDATA_PIN   0
#define PGA_SCK_PIN     2
#define VR              A2


int val;

int volume_left, old_l;
int volume_right, old_r;

void pga2311_init(void)
{
  pinMode(PGA_CS_PIN,    OUTPUT);    // pga-chipselect pin
  pinMode(PGA_SDATA_PIN, OUTPUT);    // pga-data-out (our data out to it) pin
  pinMode(PGA_SCK_PIN,   OUTPUT);    // pga-clock pin
  pinMode(PGA_ZCEN_PIN, OUTPUT);

}

void pga2311_enable_zero_crossing_detection()
{
  digitalWrite(PGA_ZCEN_PIN, HIGH);
}

void pga2311_disable_zero_crossing_detection()
{
  digitalWrite(PGA_ZCEN_PIN, LOW);
}

void SPI_write(uint8_t out_spi_byte )
{
  uint8_t  i;

  // loop thru each of the 8-bits in the byte
  for (i=0; i < 8; i++) {

    // strobe clock
    digitalWrite(PGA_SCK_PIN, LOW);

    // send the bit (we look at the high order bit and 'print' that to the remote device)
    if (0x80 & out_spi_byte) {  // MSB is set
      digitalWrite(PGA_SDATA_PIN, HIGH);
    }
    else {
      digitalWrite(PGA_SDATA_PIN, LOW);
    }

    // unstrobe the clock via local SPI
    digitalWrite(PGA_SCK_PIN, HIGH);

    // get the next bit
    out_spi_byte <<= 1;   // left-shift the byte by 1 bit
  }
}

void pga2311_mute()
{
  pga2311_set_volume(0, 0);
}


void pga2311_set_volume( uint8_t left, uint8_t right )
{
  // Gain (dB) = 31.5 − [0.5 * (255 − N)]

  digitalWrite(PGA_CS_PIN, LOW);     // assert CS

  SPI_write(left);    // left value (0..255)
  SPI_write(right);   // right value (0..255)

  digitalWrite(PGA_CS_PIN, HIGH);    // deassert CS
}



void setup()   {
  pga2311_init();
  pga2311_enable_zero_crossing_detection();

}

void loop()                  
{
 int Read =  analogRead(2);
 int val = map(Read, 0, 1023, 0, 255);
 pga2311_set_volume(val,val);
 delay(10);
 

}

2014年8月31日 星期日

Attiny + PGA2311 音量控制器

我知道這張照片看起來超醜......

總之,這次是把上次做的Arduino PGA2311音量控制器移動到Attiny去,Code基本上一樣,唯一變化的只有控制器改成用VR,電路基本上和之前的差不多,都是OPA Buffer完之後用PGA2311控制音量,最後由Attiny85控制.
Code Size基本上不到2K,所以其實是可以把85換成25or45,可能之後下一版出來我會把Attiny85挪作他用XD
至於為啥不用VR控制音量就好了這點在之前的作品就有說明了不再重複

然後就是為啥要有第二版?....因為這版悲劇的點不少
第一就是那條跳線很煩..仔細看的話會發現那條是接再VR的輸出,結果我剛接上去發現都沒聲音,還以為PGA2311壞了....
第二就是VR的大小,原先要用的是 比較小的版本,但是通常外面都不好買,所以下次要改成兩種版本都能用的
第三就是那個耳機接頭,真的___難搞,下次應該要把耳機接頭腳位也留在上面的
第四我還在考慮的就是要不要把正負電壓產生器也放上去,可能要先量一下整機的耗電量再來看吧

2014年8月10日 星期日

CC3000 Breakout board

首先是第一版:
這一版就是https://github.com/kuym/TICC3000Breakout
用的是PCB天線,而不是陶瓷天線,可以省下一些找料件的麻煩,但是這一版有很大的問題
那就是天線走線竟然有90度的直角出現 = =" 而且我沒注意到就直接送洗了....
第二版改成用u.fl直接接出來,省的麻煩,天線走線也改了一下
還有就是把I2C接腳拉出來
另外就是電源的部分,
CC3000需要兩個供電,一個是VBAT,是主要的供電,會輸入到內建的Step-down轉成1.8V左右
Input range 是2.7~4.8
另一個則是VIO,主要是供應內建的電平轉換IC將1.8V的通訊轉換成VIO的電平,Input range是1.8~3.6V
結果我看到一堆CC3000 breakout 都是兩個接再一起再用一個3.3V的LDO解決
問題是我現在的使用方式都是接上鋰電池使用,電壓在3~4.2V,那為啥不直接接到VBAT去就好了,還要經過LDO轉3.3V再用DC-DC轉成1.8V?這樣有點浪費了
所以我把3.3V的部分直接導到VBAT,再用一個LDO給VIO使用,中間留有一個Jumpper可以把兩個短接保留原先的電路設計
我想這次重點有兩個,第一個是天線走線的設計,
另外一個就是CC3000的焊接了,這次我買了一個熱風槍來焊接,
先在兩個零件都上錫,再用熱風槍吹阿吹的,融化了之後就會發現他沉下去,而且稍微一動一下還會回彈,這時候輕壓一下就焊接完了
重點是錫不能上太多,不然輕壓的時候就會溢到另外一隻腳就短路了
還有最後一個重點,有的時候CC3000沒辦法用不是因為他壞了,有的時候是線的問題......
這害我誤以為我焊接壞了...然後又拿去Rework...
最後一點...光華沒有U.FL的天線座不用找了 = =


2014年8月9日 星期六

PCM5122 DAC for Raspberry pi

這就是上次pcm5122 DAC with RPI的PCB版
首先就是這次把DVCC和電容幫浦的CPVCC接再一起,
而AVCC則是用一個LDO從5V降到3.3V供應
在來就是LDO這次的設計可以支援多種EN,BP的設計,要接VCC或是接GND都可以選擇
大概就只差5V進去的時候有沒有加電感了吧
還有就是PCM5122用I2C控制,所以可以看到板子上比之前的PCM5102a DAC多了兩個i2C的接點,
然後就是這次在i2S的線路上增加電阻damping

Driver直接用IQaudIO的,這樣就比之前的PCM5102a DAC多了音量控制