Перейти к содержанию

8051F120 + Dac


krant

Рекомендуемые сообщения

Не могу понять где загвоздка.

Всего 3 регистра:

- Конфигурации

- МЗР ЦАП

- СЗР ЦАП

так вот, при записи в эти регистры, изменения выходного уровня не происходит.

Мож я чего упустил ? (задержку в 10мкс для установления уровня учёл).

Вот код (экзампл, писал не я, код поставляется с MPLAB IDE):


#include "c8051f120.h"                 // SFR declarations

sfr16 RCAP4    = 0xca;                 // Timer4 capture/reload
sfr16 TMR4     = 0xcc;                 // Timer4
sfr16 DAC0     = 0xd2;                 // DAC0 data
sfr16 DAC1     = 0xd2;                 // DAC1 data

#define INTCLK       24500000          // Internal oscillator frequency in Hz
#define SYSCLK       49000000          // Output of PLL derived from (INTCLK*2)

#define SAMPLE_RATE_DAC 100000L        // DAC sampling rate in Hz
#define PHASE_PRECISION 65536          // range of phase accumulator

#define FREQUENCY 1000                 // Frequency of output waveform in Hz

unsigned int PHASE_ADD = FREQUENCY * PHASE_PRECISION / SAMPLE_RATE_DAC;

int code SINE_TABLE[256] = {

  0x0000, 0x0324, 0x0647, 0x096a, 0x0c8b, 0x0fab, 0x12c8, 0x15e2, 
  0x18f8, 0x1c0b, 0x1f19, 0x2223, 0x2528, 0x2826, 0x2b1f, 0x2e11,
  0x30fb, 0x33de, 0x36ba, 0x398c, 0x3c56, 0x3f17, 0x41ce, 0x447a, 
  0x471c, 0x49b4, 0x4c3f, 0x4ebf, 0x5133, 0x539b, 0x55f5, 0x5842,
  0x5a82, 0x5cb4, 0x5ed7, 0x60ec, 0x62f2, 0x64e8, 0x66cf, 0x68a6, 
  0x6a6d, 0x6c24, 0x6dca, 0x6f5f, 0x70e2, 0x7255, 0x73b5, 0x7504,
  0x7641, 0x776c, 0x7884, 0x798a, 0x7a7d, 0x7b5d, 0x7c29, 0x7ce3, 
  0x7d8a, 0x7e1d, 0x7e9d, 0x7f09, 0x7f62, 0x7fa7, 0x7fd8, 0x7ff6,
  0x7fff, 0x7ff6, 0x7fd8, 0x7fa7, 0x7f62, 0x7f09, 0x7e9d, 0x7e1d, 
  0x7d8a, 0x7ce3, 0x7c29, 0x7b5d, 0x7a7d, 0x798a, 0x7884, 0x776c,
  0x7641, 0x7504, 0x73b5, 0x7255, 0x70e2, 0x6f5f, 0x6dca, 0x6c24, 
  0x6a6d, 0x68a6, 0x66cf, 0x64e8, 0x62f2, 0x60ec, 0x5ed7, 0x5cb4,
  0x5a82, 0x5842, 0x55f5, 0x539b, 0x5133, 0x4ebf, 0x4c3f, 0x49b4, 
  0x471c, 0x447a, 0x41ce, 0x3f17, 0x3c56, 0x398c, 0x36ba, 0x33de,
  0x30fb, 0x2e11, 0x2b1f, 0x2826, 0x2528, 0x2223, 0x1f19, 0x1c0b, 
  0x18f8, 0x15e2, 0x12c8, 0x0fab, 0x0c8b, 0x096a, 0x0647, 0x0324,

  0x0000, 0xfcdc, 0xf9b9, 0xf696, 0xf375, 0xf055, 0xed38, 0xea1e, 
  0xe708, 0xe3f5, 0xe0e7, 0xdddd, 0xdad8, 0xd7da, 0xd4e1, 0xd1ef,
  0xcf05, 0xcc22, 0xc946, 0xc674, 0xc3aa, 0xc0e9, 0xbe32, 0xbb86, 
  0xb8e4, 0xb64c, 0xb3c1, 0xb141, 0xaecd, 0xac65, 0xaa0b, 0xa7be,
  0xa57e, 0xa34c, 0xa129, 0x9f14, 0x9d0e, 0x9b18, 0x9931, 0x975a, 
  0x9593, 0x93dc, 0x9236, 0x90a1, 0x8f1e, 0x8dab, 0x8c4b, 0x8afc,
  0x89bf, 0x8894, 0x877c, 0x8676, 0x8583, 0x84a3, 0x83d7, 0x831d, 
  0x8276, 0x81e3, 0x8163, 0x80f7, 0x809e, 0x8059, 0x8028, 0x800a,
  0x8000, 0x800a, 0x8028, 0x8059, 0x809e, 0x80f7, 0x8163, 0x81e3, 
  0x8276, 0x831d, 0x83d7, 0x84a3, 0x8583, 0x8676, 0x877c, 0x8894,
  0x89bf, 0x8afc, 0x8c4b, 0x8dab, 0x8f1e, 0x90a1, 0x9236, 0x93dc, 
  0x9593, 0x975a, 0x9931, 0x9b18, 0x9d0e, 0x9f14, 0xa129, 0xa34c,
  0xa57e, 0xa7be, 0xaa0b, 0xac65, 0xaecd, 0xb141, 0xb3c1, 0xb64c, 
  0xb8e4, 0xbb86, 0xbe32, 0xc0e9, 0xc3aa, 0xc674, 0xc946, 0xcc22,
  0xcf05, 0xd1ef, 0xd4e1, 0xd7da, 0xdad8, 0xdddd, 0xe0e7, 0xe3f5, 
  0xe708, 0xea1e, 0xed38, 0xf055, 0xf375, 0xf696, 0xf9b9, 0xfcdc,
};

//-----------------------------------------------------------------------------
// Function Prototypes
//-----------------------------------------------------------------------------

void main(void);
void OSCILLATOR_Init(void);
void DAC0_Init (void);
void DAC1_Init (void);
void TIMER4_Init(int counts);
void Set_DACs(void);

//-----------------------------------------------------------------------------
// MAIN Routine
//-----------------------------------------------------------------------------

void main (void) 
{
  WDTCN = 0xde;                       // Disable watchdog timer
  WDTCN = 0xad;

  OSCILLATOR_Init ();                 // Initialize oscillator
  DAC0_Init ();                       // Initialize DAC0
  DAC1_Init ();                       // Initialize DAC1   

  TIMER4_Init(SYSCLK/SAMPLE_RATE_DAC);// Initialize Timer4 to overflow 
                                      // <SAMPLE_RATE_DAC> times per
                                      // second

  EA = 1;                             // Enable global interrupts

  while(1);
} 

//-----------------------------------------------------------------------------
// Interrupt Service Routines
//-----------------------------------------------------------------------------

//-----------------------------------------------------------------------------
// TIMER4_ISR -- Wave Generator
//-----------------------------------------------------------------------------
//
// This ISR is called on Timer4 overflows.  Timer4 is set to auto-reload mode
// and is used to schedule the DAC output sample rate in this example.
// Note that the value that is written to DAC1 during this ISR call is
// actually transferred to DAC1 at the next Timer4 overflow.
//
void TIMER4_ISR (void) interrupt 16
{
  TF4 = 0;                            // Clear Timer4 overflow flag 
  Set_DACs();
}


//-----------------------------------------------------------------------------
// Initialization Routines
//-----------------------------------------------------------------------------

//-----------------------------------------------------------------------------
// OSCILLATOR_Init
//-----------------------------------------------------------------------------
//
// Return Value : None
// Parameters   : None
//
// This function initializes the system clock to use the internal oscillator
// at 24.5 MHz multiplied by two using the PLL.
//
//-----------------------------------------------------------------------------

void OSCILLATOR_Init (void)
{
   int i = 0;
   SFRPAGE   = CONFIG_PAGE;
   OSCICN    = 0x83;
   CCH0CN    &= ~0x20;
   SFRPAGE   = LEGACY_PAGE;
   FLSCL     = 0x90;
   SFRPAGE   = CONFIG_PAGE;
   CCH0CN    |= 0x20;
   PLL0CN    |= 0x01;
   PLL0DIV   = 0x01;
   PLL0FLT   = 0x21;
   PLL0MUL   = 0x02;
   for (i = 0; i < 15; i++);  // Wait 5us for initialization
   PLL0CN    |= 0x02;
   while ((PLL0CN & 0x10) == 0);
   CLKSEL    = 0x02;
}


//-----------------------------------------------------------------------------
// DAC0_Init
//-----------------------------------------------------------------------------
//
// Return Value : None
// Parameters   : None
//
// Configure DAC0 to update on Timer4 overflows and enable the the VREF buffer.
//
//-----------------------------------------------------------------------------

void DAC0_Init(void){

  char SFRPAGE_SAVE = SFRPAGE;        // Save Current SFR page

  SFRPAGE = DAC0_PAGE;

  DAC0CN = 0x94;                      // Enable DAC0 in left-justified mode
                                      // managed by Timer4 overflows
  SFRPAGE = LEGACY_PAGE;

  REF0CN |= 0x03;                     // Enable the internal VREF (2.4v) and
                                      // the Bias Generator

  SFRPAGE = SFRPAGE_SAVE;             // Restore SFR page

}

//-----------------------------------------------------------------------------
// DAC1_Init
//-----------------------------------------------------------------------------
//
// Return Value : None
// Parameters   : None
//
// Configure DAC1 to update on Timer4 overflows and enable the the VREF buffer.
//
//-----------------------------------------------------------------------------


void DAC1_Init(void){

  char SFRPAGE_SAVE = SFRPAGE;        // Save Current SFR page

  SFRPAGE = DAC1_PAGE;

  DAC1CN = 0x94;                      // Enable DAC1 in left-justified mode
                                      // managed by Timer4 overflows
  SFRPAGE = LEGACY_PAGE;

  REF0CN |= 0x03;                     // Enable the internal VREF (2.4v) and
                                      // the Bias Generator

  SFRPAGE = SFRPAGE_SAVE;             // Restore SFR page

}


//-----------------------------------------------------------------------------
// TIMER4_Init
//-----------------------------------------------------------------------------
//
// Return Value : None
// Parameters   :
//   1)  int counts - calculated Timer overflow rate
//                    range is positive range of integer: 0 to 32767
//
// Configure Timer4 to auto-reload at interval specified by <counts> using 
// SYSCLK as its time base.
//
//-----------------------------------------------------------------------------

void TIMER4_Init (int counts)
{
  char SFRPAGE_SAVE = SFRPAGE;        // Save Current SFR page

  SFRPAGE = TMR4_PAGE;

  TMR4CN = 0x00;                      // Stop Timer4; Clear overflow flag (TF4);
                                      // Set to Auto-Reload Mode

  TMR4CF = 0x08;                      // Configure Timer4 to increment;
                                      // Timer4 counts SYSCLKs

  RCAP4 = -counts;                    // Set reload value
  TMR4 = RCAP4;                       // Initialzie Timer4 to reload value

  EIE2 |= 0x04;                       // Enable Timer4 interrupts
  TR4 = 1;                            // Start Timer4

  SFRPAGE = SFRPAGE_SAVE;             // Restore SFR page
}

//-----------------------------------------------------------------------------
// Set_DACs
//-----------------------------------------------------------------------------
//
// Return Value : None
// Parameters   : None
//
// Calculates the update values for the two DACs using SINE_TABLE.  The DACs
// will actually be updated upon the next Timer4 interrupt.  Until that time,
// the DACs will hold their current value.
//
//-----------------------------------------------------------------------------

void Set_DACs(void)
{
  char SFRPAGE_SAVE = SFRPAGE;        // Save Current SFR page
  static unsigned phase_acc = 0;      // Holds phase accumulator
  int SIN_temp, COS_temp;             // Temporary 16-bit variables 
  unsigned char index;                // Index into SINE table
  phase_acc += PHASE_ADD;             // Increment phase accumulator
  index = phase_acc >> 8;
  SIN_temp = SINE_TABLE[index];       // Read the table value  
  index += 64;                        // 90 degree phase shift 
  COS_temp = SINE_TABLE[index];
  // Add a DC bias to change the the rails from a bipolar (-32768 to 32767)
  // to unipolar (0 to 65535)
  // Note: the XOR with 0x8000 translates the bipolar quantity into 
  // a unipolar quantity.
  SFRPAGE = DAC0_PAGE;
  //DAC0 = 0x8000 ^ SIN_temp;           // Write to DAC0
  DAC0 = SIN_temp;           // Write to DAC0
  SFRPAGE = DAC1_PAGE;
  DAC1 = 0x8000 ^ COS_temp;           // Write to DAC1 
  SFRPAGE = SFRPAGE_SAVE;             // Restore SFR page
}


//-----------------------------------------------------------------------------
// End Of File
//-----------------------------------------------------------------------------

Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

между DAC1 и землёй 310кОм в рабочем режиме. Нагрузкой является щуп осцилографа, у него входное сопротивление 1МОм.

Меня просто смущает то, что код из примера проработал всего 1 раз, показал красивый синус, в предпоследний раз он показал мне кривой меандр, с фронтаму пропущеными буд-то через ФНЧ (с красивым переходным процессом), и после этого уже всё, кердык, вижу только шув в 250мВ.

p.s. В режиме ПРОГРАМИРОВАНИЯ дебаггером, на этом пине появляется 0.8В, и держится до включения процессора (из под компилятора нажимаем на Run)

Изменено пользователем krant
Ссылка на комментарий
Поделиться на другие сайты

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Всему виной моя невнимательность. Оказывается для ЦАП именно 8051F120 нужно обязательно ВНЕШНЕЕ питание , которое подключается к VREFD. Подключил - всё заработало.

Ссылка на комментарий
Поделиться на другие сайты

  • 3 недели спустя...

Вернусь к теме. Когда собирал в корпус, оторвал ножку на ЦАП0. ну думаю не беда, перекину на ЦАП1, не тут то было, почему-то постоянный уровень ЦАП1 держать отказывается.

Посмотрел по ДЩ, инициализаируются оба ЦАПА абсолютно идентично, Только почему-то один не держит постоянку, это чего такое весёлое ?

Генерировал Пилу (5Гц), спады по экспоненте, как будто конденсатор разряжается

-------------------------------------------------------------------------------

p.s. проблема разрешилась перепайкой контактного провода, введением заголовка SFRPAGE=DAC1_PAGE перед обьявлением значение регистров DA1L && DA1H. Всё заработало :)

Изменено пользователем krant
Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...