1

Тема: CS3310 - Stereo Digital Volume Control

Features
Complete Digital Volume Control
2 Independent Channels
— Serial Control
— 0.5 dB Step Size
Wide Adjustable Range
— -95.5 dB Attenuation
— +31.5 dB Gain
Low Distortion & Noise
— 0.001% THD+N
— 116 dB Dynamic Range
Noise Free Level Transitions
Channel-to-Channel Crosstalk Better Than 110 dB

Данный контент доступен только зарегистрированным пользователям.

http://forum.rcl-radio.ru/uploads/images/2020/05/4e56bff41d83cacd0632e2a36f8782b5.png

http://forum.rcl-radio.ru/uploads/images/2020/05/10751bef417c60d033677607035b79ab.png

http://forum.rcl-radio.ru/uploads/images/2020/05/c41c65cf63314985570b7f83166cf8c7.png

http://forum.rcl-radio.ru/uploads/images/2020/05/107e11d73cdbf6f5db20bf33e90f3e78.png

Данный контент доступен только зарегистрированным пользователям.


test.ino

#include <CS3310.h>

CS3310 cs(2,3,4);//CS,SCLK,SDATAI

void setup(){
  delay(100);
  audio();
  
  }

void loop(){}

void audio(){
  cs.setVol(200,200);
  // byte 0  === mute
  // byte 1...255 === -95.5...+31.5 dB (step 0.5 dB)
  }

CS3310.h

//  Alexander Liman
//  liman324@yandex.ru
//  rcl-radio.ru

#ifndef  CS3310_H
#define  CS3310_H

#include <Arduino.h>


class  CS3310
  {
    public:

  CS3310(uint8_t, uint8_t, uint8_t);
  void setVol(byte r, byte l);
  
    private:

  uint8_t CS;
  uint8_t SCLK;
  uint8_t SDATAI;

  };
#endif

CS3310.cpp

#include <CS3310.h>

CS3310::CS3310(uint8_t cs, uint8_t sclk, uint8_t sdatai){
            CS = cs;
            SCLK = sclk;
            SDATAI = sdatai;
      pinMode(CS,OUTPUT);
      pinMode(SCLK,OUTPUT);
      pinMode(SDATAI,OUTPUT);
}

void CS3310::setVol(byte r, byte l){
     // start 
     digitalWrite(CS,HIGH);
     digitalWrite(SCLK,HIGH);
     delay(2);
     digitalWrite(CS,LOW);

     //  R
  for(int i = 7; i >= 0; i--){
        digitalWrite(SCLK,LOW);//delay(1);
        digitalWrite(SDATAI, (r >> i) & 0x01);delay(1);
        digitalWrite(SCLK,HIGH);delay(1);
  }

     //  L
  for(int i = 7; i >= 0; i--){
        digitalWrite(SCLK,LOW);//delay(1);
        digitalWrite(SDATAI, (l >> i) & 0x01);delay(1);
        digitalWrite(SCLK,HIGH);delay(1);
  }
   // end
   digitalWrite(CS,HIGH);
}

2

Re: CS3310 - Stereo Digital Volume Control

http://forum.rcl-radio.ru/uploads/images/2020/05/60ef81cf6ff197690bfee2ecb84efb85.png


#include <Wire.h> 
#include <EEPROM.h>
#include <Encoder.h>  // https://rcl-radio.ru/wp-content/uploads/2019/05/Encoder.zip
#include <MsTimer2.h> // https://rcl-radio.ru/wp-content/uploads/2018/11/MsTimer2.zip
#include <CS3310.h>
#include <LiquidCrystal_I2C.h> //Библиотека -  http://forum.rcl-radio.ru/misc.php?action=pan_download&item=45&download=1
  LiquidCrystal_I2C lcd(0x27,16,2);  // Устанавливаем дисплей 
  Encoder myEnc(9, 8);//CLK, DT
  CS3310 cs(2,3,4);//CS,SCLK,SDATAI

  byte a1[8] = {0b00000,0b10101,0b10101,0b10101,0b10101,0b10101,0b10101,0b00000};
  byte a2[8] = {0b00000,0b10100,0b10100,0b10100,0b10100,0b10100,0b10100,0b00000};
  byte a3[8] = {0b00000,0b10000,0b10000,0b10000,0b10000,0b10000,0b10000,0b00000};  
  int vol,vol_d,z,z0,z1;
  byte w,w1;
  unsigned long times,oldPosition  = -999,newPosition;

void setup(){ 
  Wire.begin();Serial.begin(9600);
  lcd.init();lcd.backlight();
  MsTimer2::set(1, to_Timer);MsTimer2::start();
  lcd.createChar(0,a1);lcd.createChar(1,a2);lcd.createChar(2,a3);
  lcd.setCursor(0,0);lcd.print("     CS3310   ");delay(3000);lcd.clear();// ЗАСТАВКА
  vol = EEPROM.read(0);
  audio();
  }

void loop(){
  if (newPosition != oldPosition){oldPosition = newPosition;
   vol=vol+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w1=1;vol_func();audio();Serial.print(vol*0.5-96,1);Serial.print(" ");Serial.println(vol);} 
   vol_d=map(vol,0,255,0,45);
   if(w1==1){
   for(z=0,z0=0,z1=0;z<=vol_d;z++,z1++){if(z1>2){z1=0;z0++;}
   if(z1==1){lcd.setCursor(z0,1);lcd.write((uint8_t)0);lcd.setCursor(z0+1,1);lcd.print("   ");}}
   if(z1==3){lcd.setCursor(z0,1);lcd.write((uint8_t)1);}
   if(z1==2){lcd.setCursor(z0,1);lcd.write((uint8_t)2);}w1=0;}
     
     lcd.setCursor(0,0);lcd.print("VOLUME ");
     if(vol*0.5-96>=0){lcd.print("+");}
     lcd.print(vol*0.5-96,1);lcd.print(" ");
     lcd.setCursor(14,0);lcd.print("dB");
//     delay(10);
   
 //////// EEPROM //////////////////////////////////////////////////
  if(millis()-times>3000 && w==1){EEPROM.update(0,vol);w=0;}
  } // LOOP

void audio(){
  cs.setVol(vol,vol);
  // byte 0  === mute
  // byte 1...255 === -95.5...+31.5 dB (step 0.5 dB)
  }
void to_Timer(){newPosition = myEnc.read()/4;}
void vol_func(){if(vol<0){vol=0;}if(vol>255){vol=255;}
  }  

3

Re: CS3310 - Stereo Digital Volume Control

mute

#include <Wire.h> 
#include <EEPROM.h>
#include <Encoder.h>  // https://rcl-radio.ru/wp-content/uploads/2019/05/Encoder.zip
#include <MsTimer2.h> // https://rcl-radio.ru/wp-content/uploads/2018/11/MsTimer2.zip
#include <CS3310.h>
#include <LiquidCrystal_I2C.h> //Библиотека -  http://forum.rcl-radio.ru/misc.php?action=pan_download&item=45&download=1
  LiquidCrystal_I2C lcd(0x27,16,2);  // Устанавливаем дисплей 
  Encoder myEnc(9, 8);//CLK, DT
  CS3310 cs(2,3,4);//CS,SCLK,SDATAI

  byte a1[8] = {0b00000,0b10101,0b10101,0b10101,0b10101,0b10101,0b10101,0b00000};
  byte a2[8] = {0b00000,0b10100,0b10100,0b10100,0b10100,0b10100,0b10100,0b00000};
  byte a3[8] = {0b00000,0b10000,0b10000,0b10000,0b10000,0b10000,0b10000,0b00000};  
  int vol,vol_d,z,z0,z1,vol_old;
  byte w,w1,mute;
  unsigned long times,oldPosition  = -999,newPosition;

void setup(){ 
  Wire.begin();Serial.begin(9600);
  lcd.init();lcd.backlight();
  MsTimer2::set(1, to_Timer);MsTimer2::start();
  lcd.createChar(0,a1);lcd.createChar(1,a2);lcd.createChar(2,a3);
  lcd.setCursor(0,0);lcd.print("     CS3310   ");delay(3000);lcd.clear();// ЗАСТАВКА
  vol = EEPROM.read(0);
  pinMode(7,INPUT);
  audio();
  }

void loop(){
   if (newPosition != oldPosition&&mute==0){oldPosition = newPosition;
   vol=vol+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w1=1;vol_func();audio();Serial.print(vol*0.5-96,1);Serial.print(" ");Serial.println(vol);} 
   vol_d=map(vol,0,255,0,45);
   if(w1==1){
   for(z=0,z0=0,z1=0;z<=vol_d;z++,z1++){if(z1>2){z1=0;z0++;}
   if(z1==1){lcd.setCursor(z0,1);lcd.write((uint8_t)0);lcd.setCursor(z0+1,1);lcd.print("   ");}}
   if(z1==3){lcd.setCursor(z0,1);lcd.write((uint8_t)1);}
   if(z1==2){lcd.setCursor(z0,1);lcd.write((uint8_t)2);}w1=0;}

   if(digitalRead(7)==LOW&&mute==0){mute=1;vol_old=vol;vol=0;audio();lcd.clear();lcd.setCursor(0,0);lcd.print("      MUTE   ");delay(300);}
   if(digitalRead(7)==LOW&&mute==1){mute=0;vol=vol_old;      audio();lcd.clear();w1=1;delay(300);}

   if(mute==0){  
     lcd.setCursor(0,0);lcd.print("VOLUME ");
     if(vol*0.5-96>=0){lcd.print("+");}
     lcd.print(vol*0.5-96,1);lcd.print(" ");
     lcd.setCursor(14,0);lcd.print("dB");}
//     delay(10);
   
 //////// EEPROM //////////////////////////////////////////////////
  if(millis()-times>3000 && w==1){EEPROM.update(0,vol);w=0;}
  } // LOOP

void audio(){
  cs.setVol(vol,vol);
  // byte 0  === mute
  // byte 1...255 === -95.5...+31.5 dB (step 0.5 dB)
  }
void to_Timer(){newPosition = myEnc.read()/4;}
void vol_func(){if(vol<0){vol=0;}if(vol>255){vol=255;}
  }  

4

Re: CS3310 - Stereo Digital Volume Control

Интересная тема...Делал РГ на этой микре,хорошая вещь,но диапазон регулировки громкости в большинстве случаев сильно избыточен,неплохо бы иметь возможность ограничивать его,как сверху,так и снизу,или через меню настроек или перед прошивкой какие то константы менять.

5

Re: CS3310 - Stereo Digital Volume Control

Эта функция ограничивает диапазон регулировки:

void vol_func(){if(vol<0){vol=0;}if(vol>255){vol=255;}

например:

void vol_func(){if(vol<20){vol=20;}if(vol>200){vol=200;}

Диапазон регулировки будет не 255 шагов а 180, можно и меньше сделать

6

Re: CS3310 - Stereo Digital Volume Control

Я заметил , что вы как то любите дисплеи 1602 . Как то вы не любите цветные дисплеи , хотя на них все очень здорово смотрится .http://forum.rcl-radio.ru/uploads/images/2020/05/615f74746a4d80ec6cbfd23b2d883c5b.jpg http://forum.rcl-radio.ru/uploads/images/2020/05/bf91353c2f6831357dbd91b20002ef71.jpg http://forum.rcl-radio.ru/uploads/images/2020/05/b8f676a8232f93f9454a8fe75f62b70d.jpg

7

Re: CS3310 - Stereo Digital Volume Control

Я делал проекты на ftf экранах для аудиопроцессоров с большим набором параметров, но все же на LCD1602 больше проектов повторяют, да и дешевле.
https://rcl-radio.ru/wp-content/uploads/2019/07/623786862187.png
https://rcl-radio.ru/wp-content/uploads/2019/04/7523965782368.png

8

Re: CS3310 - Stereo Digital Volume Control

Ну здесь на мой взгляд как то слишком много информации сразу выведено . Это чисто мое мнение , это как будто панель управления станка ЧПУ.http://forum.rcl-radio.ru/uploads/images/2020/05/bc7bf22400528a271fff16aeaba277f7.jpg  Вот здесь как то более гармонично смотрится .

9

Re: CS3310 - Stereo Digital Volume Control

Все можно сделать, но пока на подобные проекты с FTF экранами интересных предложений мне не поступало.

10

Re: CS3310 - Stereo Digital Volume Control

Понял , спасибо за ответ .

11

Re: CS3310 - Stereo Digital Volume Control

Еще раз убедился на практике,что полный диапазон регулировки нужно ограничивать , в ряде случаев приводит к подвозбуду оконечников и подгоранию резистора в цобеле,когда кто то сдуру загонит регулировку в +31дб,даже при отсутствии сигнала.