Миландр

Ключевым подразделением нашей компании является Центр Проектирования интегральных микросхем
Текущее время: 2017-мар-27 11:37

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 2 ] 
Автор Сообщение
 Заголовок сообщения: Управление ШИМ с помощью АЦП
СообщениеДобавлено: 2015-авг-14 12:13 
Не в сети

Зарегистрирован: 2014-авг-26 14:20
Сообщения: 1
Здравствуйте! Не получается управлять скважностью с помощью АЦП! Подскажите, что делаю не правильно?
Код:
#include <1886VE2d.h>
#include "int17xxx.h"
#pragma origin 0x8

#pragma bit pwm1 @ PORTB.2           //ВЫХОД ШИМ1

void adc_pwm();         // считывание значений ацп и формирование ШИМ

char adcr[2];                         // буфер рез-та преобр-я АЦП
long del_3200;                        // деление на 3200
char led;                             //буфер для порта Д



interrupt iServer(void)
{
    multi_interrupt_entry_and_save

PERIPHERAL_service:
                   
    if (TMR1IF)                      //обработка прерывания от таймера 1(частота прерываний 16 кГц)
  {
    //новое значение ШИМ
           
            PW1DCL = adcr[1];           // устанавливаем скважность ШИМ
            PW1DCH = adcr[0];   
            TMR1IF = 0;
  }   
  goto RESTORE_and_return;
TMR0_service:
     
      T0CS = 0; // останавливаем таймер
      T0IF = 0;  // сбрасываем флаг
      adc_pwm();   

    // save on demand: PRODL,PRODH,TBLPTRH,TBLPTRL,FSR0,FSR1
    /* process Timer 0 interrupt */
    // T0IF is automatically cleared when the CPU vectors to 0x10
    // restore on demand: PRODL,PRODH,TBLPTRH,TBLPTRL,FSR0,FSR1
T0CKI_service:
INT_service:
             
  RESTORE_and_return:           
    interrupt_exit_and_restore
}
/******************/


void main(void)
{
     GLINTD = 1;                               // запрет всех прерываний.
     
     DDRG = 0b11111111;                        //PORTG1 -вход ADC
     DDRF = 0;                                 // порт Ф выход
     PORTF = 0 ;                       
     del_3200 = 3200;                         
     led = 0b11111111;
     
     
     // настройка таймера 0
     
     TMR0L = 0x1E;    // формируем частоту прерывания
     TMR0H = 0xFB;    // 3,2 кГц (f=16MHz)   
     T0STA = 0b00100000;    // внутренняя тактовая частота
     
     // настройка АЦП
     
     ADCON0=0b00100000;                      //AN2 - аналоговый канал, выключение ADC,GO/DONE в 0
     ADCON1=0b10001010;                      //Частота ADC FC/64,левое выравнивание, PORTG1,2,3 - аналоговые входы, опорное напряжение Avdd, Avss
     
     
     // настройка ШИМ и TMR1
     
  PR1 = 0xFF;      //период
  PW1DCH = 0x00;   // начальные значения
  PW1DCL = 0x00;   // длительности импульсов
 
  TCON1 = 0x00;     //
  TCON2= 0b00010001; // вклечен TMR1 и PWM1         
                   
  PIE1=0b00010000;                        //разрешение прерываний от таймера1
  PIE2=0b00000000;                        //запрет всех остальных периферийных прерываний
  INTSTA = 0b00001010; //разрешено прерывание  по ТМР0 и периферия
  GLINTD = 0;          //глобальное разрешение прерываний 
     
      while(1);
}
               
void adc_pwm()
      {
               
      TMR0L = 0x1E;    // 3,2 кГц (f=16MHz)         
      TMR0H = 0xFB;    // формируем частоту прерывания
      T0CS = 1;        // включаем таймер
       
       // мигаем светодиодами 1Гц
         del_3200--;
         if(del_3200 == 0)
        {
         led = led << 1;           
         PORTF = led;
         if(led == 0)
         led = 0b11111111;
         del_3200 = 3200;
         }
         
      // Включение АЦП
         
          ADON=1;                           //Включение АЦП
          ADCON0.2=1;
          while (ADCON0.2) ; // ждать преобразования
         
           ADON=0;                           //Отключение АЦП
         
           adcr[0]=ADRESH;                   //Сохранение рез-та
           adcr[1]=ADRESL;                   //в буферные ячейки
           
          ADIF = 0;                         // сбросфлага
   
      return;
      }                   
                     


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Управление ШИМ с помощью АЦП
СообщениеДобавлено: 2015-авг-14 15:25 
Не в сети

Зарегистрирован: 2014-май-15 11:04
Сообщения: 105
Откуда: Москва
С подобной проблемой легко справиться самостоятельно разбив задачу на части.....


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 2 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot] и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB