реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> ADC12, прерывания по таймеру А
jorikdima
сообщение Aug 5 2008, 19:24
Сообщение #1


тут может быть ваша реклама
*****

Группа: Свой
Сообщений: 1 164
Регистрация: 15-03-06
Из: Санкт-Петербург/CA
Пользователь №: 15 280



Приветствую.
Два дня парюсь уже с непонятной мне проблеммой. Хочу, чтобы АЦП срабатывал периодически и период бы этот определялся по таймеру А. Настраиваю таймер на работу и проверяю по частоте миганий светодиода правильно ли установлена периодичность прерывания от таймера. Оказывается правильно. Теперь хочу, чтобы ровно с этим же периодом у меня запускался АЦП на измерение и вызывалось его прерывание, но это происходит почему то в 4 раза реже, чем прерывания от таймера. Код следующий.

Код
TACCTL1 = OUTMOD_3;
TACTL = TASSEL_1;   // ACLK = 32768kHz
    
TACCR1 = 0x4000; // 0x4000/32768 = 0.5
TACCR0 = 0x4000;

Это настройка таймера, который тактируется от часового кварца. Режим Up (ниже выбор этого режима) и в этом случае если разрешить прерывание от CCR1 или CCR2 то оно будет происходить с частотй пол секунды. Так и есть. Первой строчкой я выбрал режим Set/Reset. Таким образом таймер досчитав до 0х4000 сигнал out сделает единицей, а на следующем такте при обнулении таймера сделает его 0. Следующий код настраивает АЦП

Код
ADC12CTL1 = SHS_1 + SHP + ADC12SSEL_3 + CONSEQ_3 + CSTARTADD_0;

/* 16 us sampling time is enough for correct sampling
SMCLK is chosen for ADC12 oscillator. For 250 kHz = 4 us
SHT1=SHT2=0 (4 clocks) -> 4us * 4 = 16 us for sampling */
ADC12CTL0 = SHT0_2 + SHT1_0;

/* Setup channels for conversation */
ADC12MCTL0 = SREF_0 + INCH_0;
ADC12MCTL1 = SREF_0 + INCH_1;
ADC12MCTL2 = SREF_0 + INCH_2;
    
/* Last channel is for reference, to estimate the bias of measurements*/
ADC12MCTL3 = SREF_3 + INCH_15 + EOS;

4 канала, тактируется от относительно быстрого SMCLK.


Код
void StartMeasuring()
{
    ADC12IE = BIT(4);
    ADC12IE = BIT(2);
    ADC12IFG = 0;
    TACTL |= TACLR + MC_1;
    ADC12CTL0 |= ADC12ON + ENC;
}

Эта функция запускает таймер и включает АЦП.

Так вот, если сделать обработчик прерывания на таймер, то он активируется с нужным периодом, но обработчик прерывания для АЦП (он вызывается по rising edge сигнала out, по идее с тем же периодом, что и прерывание таймера) вызывается в 4 раза реже 07.gif 07.gif
Что это?
Спасибо.
Go to the top of the page
 
+Quote Post
rezident
сообщение Aug 5 2008, 19:45
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(jorikdima @ Aug 6 2008, 01:24) *
Так вот, если сделать обработчик прерывания на таймер, то он активируется с нужным периодом, но обработчик прерывания для АЦП (он вызывается по rising edge сигнала out, по идее с тем же периодом, что и прерывание таймера) вызывается в 4 раза реже 07.gif 07.gif
Что это?
Не вижу противоречия. Фронт сигнала SAMPCON формируется на каждое второе прерывание таймера. А прерывания АЦП у вас разрешены от 1 и 3 регистров результата преобразования, т.е. прерывание от АЦП на каждое второе преобразование возникает. Так что все верно. Дважды два = 4 wink.gif
Go to the top of the page
 
+Quote Post
jorikdima
сообщение Aug 9 2008, 08:00
Сообщение #3


тут может быть ваша реклама
*****

Группа: Свой
Сообщений: 1 164
Регистрация: 15-03-06
Из: Санкт-Петербург/CA
Пользователь №: 15 280



Цитата(rezident @ Aug 5 2008, 23:45) *
Не вижу противоречия. Фронт сигнала SAMPCON формируется на каждое второе прерывание таймера. А прерывания АЦП у вас разрешены от 1 и 3 регистров результата преобразования, т.е. прерывание от АЦП на каждое второе преобразование возникает. Так что все верно. Дважды два = 4 wink.gif

rezident, спасибо большое, что всегда отвечаете. Был занят, поэтому отвечаю с запозданием. Не могли бы Вы для начала объяснить, а лучше показать в даташите, то что я выделил жирным в цитате. Я вот никак не могу сообразать почему так???
Как мне кажется, SAMPCON устанавливается в 1 при rizing edge сигнала out от таймера. Этот сигнал, в свою очередь, сменяется 0->1 при достижении таймера значения 0x4000 и на следующем же такте переходит опять в 0. То есть частота rizing edge сигнала out == частоте прерывания.
Второе. Я чуть чуть забыл скорректировать код у себя в части разрешения прерываний. Сейчас исправил, у меня прерывание разрешено только от 4 канала. То есть используется 4 канала АЦП и как только все будут готовы (4-ый окончит работу), то идет прерывание.
Код
ADC12IE = 0x8;

Почему то поправить предыдущее сообщение не смог 07.gif , тут написал исправление.
Go to the top of the page
 
+Quote Post
jorikdima
сообщение Aug 9 2008, 12:59
Сообщение #4


тут может быть ваша реклама
*****

Группа: Свой
Сообщений: 1 164
Регистрация: 15-03-06
Из: Санкт-Петербург/CA
Пользователь №: 15 280



По лпроблемы решено smile.gif я думал, что 16 битный таймер полностью сделает круг тактируясь от 32 кГц за 1 секунду smile.gif оказалось, что 2^16=65тыс а не 32тыс smile.gif
Go to the top of the page
 
+Quote Post
rezident
сообщение Aug 9 2008, 16:53
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(jorikdima @ Aug 9 2008, 14:00) *
rezident, спасибо большое, что всегда отвечаете. Был занят, поэтому отвечаю с запозданием. Не могли бы Вы для начала объяснить, а лучше показать в даташите, то что я выделил жирным в цитате. Я вот никак не могу сообразать почему так???
Как мне кажется, SAMPCON устанавливается в 1 при rizing edge сигнала out от таймера. Этот сигнал, в свою очередь, сменяется 0->1 при достижении таймера значения 0x4000 и на следующем же такте переходит опять в 0. То есть частота rizing edge сигнала out == частоте прерывания.
У вас значения CCR0 и CCR1 одинаковы. Поэтому события EQU0 и EQU1 фиксируются одновременно. Но поскольку используется режим счета CountUp, то EQU0 задерживается на один такт TACLK. Так что на каждый период формируется полный импульс TA1OUT и соответственно SAMPCON. Я был неправ, т.к. запамятовал про задержанный EQU0.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 29th July 2025 - 14:28
Рейтинг@Mail.ru


Страница сгенерированна за 0.0141 секунд с 7
ELECTRONIX ©2004-2016