Работа с АЦП CH32V203

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить
Аватара пользователя
alex38779
Потрогал лапой паяльник
Сообщения: 386
Зарегистрирован: Чт окт 31, 2013 10:54:32
Контактная информация:

Работа с АЦП CH32V203

Сообщение alex38779 »

Мяу коты :) Дошел до работы с АЦП в контроллере CH32V203. И не могу запустить чтение 1 канала АЦП на ноге РА1. Тактирование порта включил.

Вот код:

Код: Выделить всё

void adc_init(void)
{
    //PA1-канал ADC1
    GPIOA->CFGLR &= ~( GPIO_CFGLR_CNF1 | GPIO_CFGLR_MODE1);

    //ADC Init
    RCC->APB2PCENR |= RCC_APB2Periph_ADC1;
    ADC1->CTLR2 |= ADC_ADON; //enable ADC
    delay_ms(100);

    ADC1->CTLR2 |= ADC_RSTCAL;
    while(ADC1->CTLR2 & ADC_RSTCAL);
    ADC1->CTLR2 |= ADC_CAL;
    while(ADC1->CTLR2 & ADC_CAL);

    ADC1->CTLR1 = 0;
    ADC1->CTLR2 |= ADC_ADON;

    ADC1->SAMPTR2 &= ~ADC_SMP1;
    ADC1->SAMPTR2 |= ADC_SMP1_0 | ADC_SMP1_2;

    //ADC1->RSQR1 = 0;
    //ADC1->RSQR2 = 0;
    ADC1->RSQR3 &= ~ADC_SQ1;

    ADC1->CTLR2 &= ~ADC_ALIGN;

    ADC1->CTLR1 &= ~ADC_SCAN;
    ADC1->CTLR2 &= ~ADC_CONT;

}
И чтение канала

Код: Выделить всё

uint16_t adc_read_single(void)
{
    ADC1->CTLR2 |= ADC_SWSTART;
    while(!(ADC1->STATR & ADC_EOC));
    ADC1->STATR &= ~ADC_EOC;
    return ADC1->RDATAR;
}
Не могу понять как настроить регистры PSQR, они все такого формата и не понятно что в них писать.
Изображение
veso74
Поставщик валерьянки для Кота
Сообщения: 1902
Зарегистрирован: Сб май 05, 2012 20:24:52
Откуда: KN34PC, Болгария
Контактная информация:

Re: Работа с АЦП CH32V203

Сообщение veso74 »

У меня к CH32V002:

Код: Выделить всё

// select 1 channel
  ADC1->RSQR1 &= ~(0xF << 20);  // L = 0, one conversion
  ADC1->RSQR3 = 1;  
  ADC1->SAMPTR2 |= ADC_SMP2_2 | ADC_SMP2_1 | ADC_SMP2_0;  // 0b111 -> 239.5 cycles// ADC_IN1
и

Код: Выделить всё

uint16_t ADC1_read(void) {
  ADC1->CTLR2 |= ADC_ADON;     // second ADON = start

  ADC1->CTLR2 |= ADC_SWSTART;  // start conversion
  while (!(ADC1->STATR & ADC_EOC));

  return ADC1->RDATAR;
}
ADC1->CTLR2 |= ADC_ADON; -> реально будет 2 раза, второе делает writing 1 will start the conversion
Аватара пользователя
alex38779
Потрогал лапой паяльник
Сообщения: 386
Зарегистрирован: Чт окт 31, 2013 10:54:32
Контактная информация:

Re: Работа с АЦП CH32V203

Сообщение alex38779 »

Не поверите, код оказался рабочий, косяк был в выводе данных.
Забыл указать куда выводить, не указал буфер в sprintf.

Код: Выделить всё

sprintf(buffer, "ADC: %u, Voltage: %lu mV\r\n", i, i1);
А дипсик расжевал про работу с регистрами ADC_RSQRx.

Сижу два часа голову ломаю.

Добавлено after 2 minutes 32 seconds:
[uquote="veso74",url="/forum/viewtopic.php?p=4777923#p4777923"]У меня к CH32V002:

ADC1->CTLR2 |= ADC_ADON; -> реально будет 2 раза, второе делает writing 1 will start the conversion[/uquote]

Добавил в функцию чтения и заработало, а то получается один раз читало канал АЦП и все.
Ответить

Вернуться в «Разные вопросы по МК»