Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту


 
Опции темы
Непрочитано 19.12.2014, 20:27  
TmYAG
Прохожий
 
Регистрация: 19.12.2014
Сообщений: 8
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
TmYAG на пути к лучшему
По умолчанию STM32F4 ADC режимы работы. Помогите разобраться

Я начал разбираться с АЦП на STM32F4Discovery.
Вычитал, что у АЦП существуют два метода опроса: регулярные каналы и инжектированные каналы.
Разницу между ними я более менее понял. Первая группа запись данных в один регистр, вторая группа результат можно записать в один из 4-х регистров.
Я стараюсь писать код используя CMSIS.
К порту PA1 прикрутил переменный резистор, и по изменению значения должны зажигаться диоды на PD12, 13, 14, 15 но почему-то не работает, подскажите пожалуйста что не так.
Код:
#include "stm32f4xx.h"
uint32_t LED_STATE = 0xF000;
uint32_t res;
int main()
{
RCC-›AHB1ENR |= RCC_AHB1ENR_GPIOAEN|RCC_AHB1ENR_GPIODEN;
RCC-›APB2ENR |= RCC_APB2ENR_ADC1EN;
//GPIOA-›MODER |= 0x0000000C;
GPIOD-›MODER |= 0x55000000;
GPIOD-›OTYPER |= 0;
GPIOD-›OSPEEDR |= 0;
ADC1-›SMPR2 |= (ADC_SMPR2_SMP1_2 | ADC_SMPR2_SMP1_1 | ADC_SMPR2_SMP1_0); //Задаем время выборки                                                                                                                                                                                 
         ADC1-›CR2 |= ADC_CR2_JEXTSEL; //Преобразование инжектированной группы                                                                                                          
         ADC1-›CR2 |= ADC_CR2_JEXTEN; //Разрешаем внешний запуск инжектированной группы
         ADC1-›CR2 |= ADC_CR2_CONT; //Преобразования запускаются одно за другим
         ADC1-›CR1 |= ADC_CR1_JAUTO;
         ADC1-›JSQR |= (1‹‹15); //Задаем номер канала - ADC1
         ADC1-›CR2 |= ADC_CR2_ADON;//Теперь включаем АЦП
         ADC1-›CR2 |= ADC_CR2_JSWSTART; //Запуск преобразований
         while (!(ADC1-›SR & ADC_SR_JEOC)); //ждем пока первое преобразование завершится
         while(1)
{

         res = ADC1-›JDR1;
         if (res › 1024)
         {
                 GPIOD-›ODR=LED_STATE ;
         }
         }
}
Поскольку я разбираюсь в режимах преобразования, то я так же пробовал написать код и для регулярных каналов:
Код:
#include "stm32f4xx.h"
uint32_t LED_STATE = 0xF000;
int main()
{
RCC-›AHB1ENR |= RCC_AHB1ENR_GPIOAEN|RCC_AHB1ENR_GPIODEN;
RCC-›APB2ENR |= RCC_APB2ENR_ADC1EN;
GPIOA-›MODER |= 0x0000000C;
GPIOD-›MODER |= 0x55000000;
GPIOD-›OTYPER |= 0;
GPIOD-›OSPEEDR |= 0;

ADC1-›SMPR2 |= (ADC_SMPR2_SMP1_2 | ADC_SMPR2_SMP1_1 | ADC_SMPR2_SMP1_0);                                                                                                                                                                        
ADC1-›CR2 |= ADC_CR2_EXTSEL;                                                                                                            
ADC1-›CR2 |= ADC_CR2_EXTEN;
ADC1-›CR2 |= ADC_CR2_CONT;
ADC1-›SQR1 |= (1‹‹15); //Задаем номер канала - ADC1
ADC1-›CR2 |= ADC_CR2_ADON;//Теперь включаем АЦП
ADC1-›CR2 |= ADC_CR2_SWSTART; //Запуск преобразований
while (!(ADC1-›SR & ADC_SR_EOC)); //ждем пока первое преобразование завершится
uint32_t res;
while(1)
{
         res = ADC1-›DR;
         if (res › 1024)
         {
                 GPIOD-›ODR=LED_STATE ;
         }
         }
}
Но он тоже не работает(((
Реклама:
TmYAG вне форума  
Непрочитано 20.12.2014, 11:26  
Uvavan
Временная регистрация
 
Регистрация: 18.04.2011
Сообщений: 84
Сказал спасибо: 23
Сказали Спасибо 6 раз(а) в 4 сообщении(ях)
Uvavan на пути к лучшему
По умолчанию Re: STM32F4 ADC режимы работы. Помогите разобраться

Если у вас идет одно преобразование вы подключаете канал ацп в инжектированном преобразовании на 4 регистр (4 очередь преобразования).
В регулярной вообще на 16, а длина преобразования всегда 1 надо сделать так:
PHP код:
ADC_JSQR|=0Х01  (если канал ацп первый в первую инжрегистр). 
для регулярного:

PHP код:
ADC_SQR3|=0Х01 (если канал ацп первый). 
да и четаете в инж. преобразование с первого регистра, а выбирали 4.
Uvavan вне форума  
Непрочитано 21.12.2014, 13:46  
TmYAG
Прохожий
 
Регистрация: 19.12.2014
Сообщений: 8
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
TmYAG на пути к лучшему
По умолчанию Re: STM32F4 ADC режимы работы. Помогите разобраться

Ну на самом деле ничего не изменилось. В режиме отладки изменяю значения переменного резистора. Но изменения значения res я не вижу.
Пробовал через прерывания. Чтобы наглядно увидеть как сваливаюсь в прерывание при изменении значения переменного резистора, но почему-то никакой реакции.
Код:
#include "stm32f4xx.h"
uint32_t LED_STATE = 0xF000;
int main()
{
RCC-›AHB1ENR |= RCC_AHB1ENR_GPIOAEN|RCC_AHB1ENR_GPIODEN;
RCC-›APB2ENR |= RCC_APB2ENR_ADC1EN;
GPIOA-›MODER |= 0x0000000C;
GPIOD-›MODER |= 0x55000000;
GPIOD-›OTYPER |= 0;
GPIOD-›OSPEEDR |= 0;

ADC1-›SMPR2 |= (ADC_SMPR2_SMP1_2 | ADC_SMPR2_SMP1_1 | ADC_SMPR2_SMP1_0);                                                                                                                                                                       
ADC1-›CR2 |= ADC_CR2_EXTSEL;                                                                                                           
ADC1-›CR2 |= ADC_CR2_EXTEN;
ADC1-›CR2 |= ADC_CR2_CONT;
ADC1-›SQR3 |= 0x01; //Задаем номер канала - ADC1
ADC1-›CR2 |= ADC_CR2_ADON;//Теперь включаем АЦП
ADC1-›CR2 |= ADC_CR2_SWSTART; //Запуск преобразований
while (!(ADC1-›SR & ADC_SR_EOC)); //ждем пока первое преобразование завершится
NVIC_EnableIRQ(ADC_IRQn);
}
void ADC_IRQHandler(void)
{
   res = ADC1-›DR;
   if (res › 1024)
         {
                 GPIOD-›ODR=LED_STATE;
         }
         else
         {
                 GPIOD-›ODR ^= LED_STATE;
         }
}
TmYAG вне форума  
Непрочитано 25.12.2014, 13:30  
TmYAG
Прохожий
 
Регистрация: 19.12.2014
Сообщений: 8
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
TmYAG на пути к лучшему
По умолчанию Re: STM32F4 ADC режимы работы. Помогите разобраться

Вроде как разобрался!
Проблема была в том, чо я неправильно задал соответсвие между каналом АЦП и пином с которого снимаю сигнал(((В итоге для регулярных каналов:
Код:
#include "stm32f4xx.h"
uint32_t LED_STATE = 0xF000;
uint32_t res;
int main()
{
RCC-›AHB1ENR |= RCC_AHB1ENR_GPIOAEN|RCC_AHB1ENR_GPIODEN;
RCC-›APB2ENR |= RCC_APB2ENR_ADC1EN|RCC_APB2ENR_SYSCFGEN;
GPIOA-›MODER |= 0x0000000C;
GPIOD-›MODER |= 0x55000000;
GPIOD-›OTYPER |= 0;
GPIOD-›OSPEEDR |= 0;
ADC1-›SMPR2 |= (ADC_SMPR2_SMP1_2 | ADC_SMPR2_SMP1_1 | ADC_SMPR2_SMP1_0); //Задаем время выборки                                                                                                                                                                                                                                                                                                                                                         
                 ADC1-›CR2 |= ADC_CR2_EXTSEL; //Преобразование инжектированной группы                                                                                                                                                                                                             
                 ADC1-›CR2 |= ADC_CR2_EXTEN; //Разрешаем внешний запуск инжектированной группы
                 ADC1-›CR2 |= ADC_CR2_CONT; //Преобразования запускаются одно за другим
                 ADC1-›SQR3 |= ADC_SQR3_SQ1_0; //Задаем номер канала - ADC1
                 ADC1-›CR2 |= ADC_CR2_ADON;//Теперь включаем АЦП
                 while(1)
{
                 ADC1-›CR2 |= ADC_CR2_SWSTART; //Запуск преобразований
                 while (!(ADC1-›SR & ADC_SR_EOC)); //ждем пока первое преобразование завершится
                 ADC1-›SR = 0; 
                 res = ADC1-›DR;
                 if (res › 1024)
                 {
                   GPIOD-›ODR = LED_STATE;
                 }
                 else
                 {
                   GPIOD-›BSRRH |= (1 ‹‹ 15)|(1 ‹‹ 14)|(1 ‹‹ 13)|(1 ‹‹ 12);
                 }
}
}
Для инжектированных:

Код:
#include "stm32f4xx.h"
uint32_t LED_STATE = 0xF000;
uint32_t res;
int main()
{
RCC-›AHB1ENR |= RCC_AHB1ENR_GPIOAEN|RCC_AHB1ENR_GPIODEN;
RCC-›APB2ENR |= RCC_APB2ENR_ADC1EN|RCC_APB2ENR_SYSCFGEN;
GPIOA-›MODER |= 0x0000000C;
GPIOD-›MODER |= 0x55000000;
GPIOD-›OTYPER |= 0;
GPIOD-›OSPEEDR |= 0;
ADC1-›SMPR2 |= (ADC_SMPR2_SMP1_2 | ADC_SMPR2_SMP1_1 | ADC_SMPR2_SMP1_0); //Задаем время выборки                                                                                                                                                                                                                                                                                                                                                         
                 ADC1-›CR2 |= ADC_CR2_JEXTSEL; //Преобразование инжектированной группы                                                                                                                                                                                                            
                 ADC1-›CR2 |= ADC_CR2_JEXTEN; //Разрешаем внешний запуск инжектированной группы
                 ADC1-›CR2 |= ADC_CR2_CONT; //Преобразования запускаются одно за другим
                 ADC1-›CR1 |= ADC_CR1_JAUTO;
                 //ADC1-›CR1 |= 0x00000020;
                 ADC1-›JSQR |= ADC_JSQR_JSQ4_0; //Задаем номер канала - ADC1
                 ADC1-›CR2 |= ADC_CR2_ADON;//Теперь включаем АЦП
                 while(1)
{
                 ADC1-›CR2 |= ADC_CR2_JSWSTART; //Запуск преобразований
                 while (!(ADC1-›SR & ADC_SR_JEOC)); //ждем пока первое преобразование завершится
                 ADC1-›SR = 0; 
                 res = ADC1-›JDR1;
                 if (res › 1024)
                 {
                   GPIOD-›ODR = LED_STATE;
                 }
                 else
                 {
                   GPIOD-›BSRRH |= (1 ‹‹ 15)|(1 ‹‹ 14)|(1 ‹‹ 13)|(1 ‹‹ 12);
                 }
}
}
Еще попробую разобраться с прерываниями по EOC
TmYAG вне форума  
 

Закладки
Опции темы

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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите разобраться с трансивером CC1100 MasterM12 Автоматика и аппаратура связи 7 20.10.2011 15:48
[Решено] Помогите разобраться с закачкой проги в сотовый. Electric75 Цифровые сигнальные процессоры 2 22.12.2009 21:20
Помогите разобраться в трех соснах maximusmod Источники питания и свет 15 19.05.2009 07:16
Помогите разобраться с импульсными стабилизаторами Vas2 Источники питания и свет 8 07.12.2007 17:27
Помогите разобраться с UART masterpc Микроконтроллеры, АЦП, память и т.д 10 13.02.2007 17:49


Часовой пояс GMT +4, время: 08:03.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot