Страница 3 из 4

Re: STM32 Первый старт

Добавлено: Вт авг 16, 2011 12:52:04
md5sum
Спасибо!
Так что это? Особенность МК 103 серии или ошибка в программе?
В железе ошибки вроде нет - у нас разные платы, а результат один :)

Re: STM32 Первый старт

Добавлено: Вт авг 16, 2011 14:36:52
Zheleznjakov
1) Шумы самого опорника
2) Время преобразования при считывание по документу 5,1 мкс, но не более 17 мкс,
Время преобразования = циклы + 12,5 = ?
при тактовой частоте 72 МГц, максимальная частота АЦП 12 МГц и следовательно необходимо примерно 61 такт - 12,5 = 49
я выбирал 55,5 что удовлетворяет условиям. Получалось значение+-4 ед.
Но параметры на АЦП приведены при тактовой 14 МГц, а это можно обеспечить при максимальной общей таковой 56 МГц, количество тактов на преобразования соответственно равно 71-12,5=59 т.е. можно оставить как было 55,5. При данной конфигурации у меня получилось значение+-3,5. Особо не улучшилось, спишем на погрешность :)
Приведенные выше измерения я проводил очень часто (программа базировалась на старом коде), решил снизить частоту дискретизации до 50 Гц, результат получился лучше максимум +-2 ед. (см рисунок, специально сильно увеличил что бы было лучше видно)
Я считаю это более чем нормально.

Re: STM32 Первый старт

Добавлено: Вт авг 16, 2011 14:57:19
md5sum
Zheleznjakov писал(а):2) Время преобразования при считывание по документу 5,1 мкс, но не более 17 мкс,
Ух..
Я правильно тогда считаю:
72МГц, Прескалер АЦП - 8 итого частота АЦП=9МГц
17мкс это 153 такта, 153-12.5=140.5 максимум
5.1мкс это 45.9 такта, 45.9-12.5=33.4 минимум

Зы: поправил.
А по какому документу время преобразования? Я наверное пол сайта ST перерыл.
Этого не нашел :(

Re: STM32 Первый старт

Добавлено: Вт авг 16, 2011 15:01:55
Zheleznjakov
Описался АПЦ вместо ЦАП :)
--
Ещё думаю нужно было проверить источник питания, чет не посмотрел сильно шумит или нет. Теперь уже завтра гляну.

Re: STM32 Первый старт

Добавлено: Ср авг 17, 2011 05:17:33
Zheleznjakov
Пришел на работу и первым делом проверил питание, УЖАС помехи почти 10 мВ !!!! поставил кондерчики и вот что получил :)
Думаю если будет заводская и нормально питание развести результат будет ещё лучше.

Re: STM32 Первый старт

Добавлено: Ср авг 17, 2011 06:33:56
Zheleznjakov
Добавил ещё дросселек по питанию... и увеличил частоту с 24 МГц до 72, соотв на АЦП 12 МГц
почему то изменились показания на 8 единиц в плюс, но стабильность по лучше стала.

Re: STM32 Первый старт

Добавлено: Ср авг 17, 2011 09:05:07
md5sum
Спасибо!
На примере UM0919 посмотрел как надо было Vdda разводить.
Жаль под дроссель на моей плате места нет.
Ну на то она и тестовая.

Re: STM32 Первый старт

Добавлено: Ср авг 17, 2011 10:44:32
Zheleznjakov
Поел, и решил снова посмотреть что да как,
нашел источник импульсов - преобразователь для RS232 :) поставил по питанию RC фильтр и все стало нормально
да же без дросселя и дополнительных кондеров, так что питание я развел нормально :) (за исключением RS232 :()
(плата http://ziblog.ru/2011/03/25/demka-dlya-stm32f103cb/)

Re: STM32 TIM1+Прерывание

Добавлено: Пн янв 02, 2012 16:39:47
dinets
dosikus писал(а):Множитель стоял 9 , выставь как на картинке.
8*9=72 однако :)))
а 100RB только 24 могет...

Изображение
а как вы это окно получили?!?!

и в догонку на какой лапе у ацпшки висит термодатчик?

Re: STM32 TIM1+Прерывание

Добавлено: Пн янв 02, 2012 16:55:45
Satyr
dinets писал(а): и в догонку на какой лапе у ацпшки висит термодатчик?
на лапе - ни на какой.
а на каком канале - см. мануал.
обычно на последнем.

Re: STM32 Первый старт

Добавлено: Пн янв 02, 2012 19:44:58
dinets
да получилось

насочинял интерестную прожку....
с АЦП и термометром

суть в том что кнопкой сохраняю температуру.
когда температура растёт плано зажигаю зелёный
когда темперетура падает (относительно уставки сделаной кнопкой) плавно зажигается синий

плавно - програмный шим

вот код

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

int a=0;
	   int b=0;
	    int  adc,adc1; 
			   void ADC_RBat(void)                   
{   
    ADC1->CR2 |= ADC_CR2_SWSTART;     //Çàïóñê ïðåîáðàçîâàíèÿ
    while (!(ADC1->SR & ADC_SR_EOC))  //Æäåì îêîí÷àíèÿ ïðåîáðàçîâàíèÿ
    { 
    }
    adc = ADC1->DR;                   //Ñ÷èòûâàåì äàííûå
   // adcLSB = adc;                     //Âûäåëÿåì ìëàäøóþ ÷àñòü
  //  adc>>=8;                          //Ñäâèãàåì
  //  adcMSB = adc;                     //È âûäåëÿåì ñòàðøóþ ÷àñòü
return;
}
void SysTick_Handler (void) {
  static uint32_t ticks;
  static int bl=0;

  if (ticks++ >= LED_BLINK_RATE) {
    ticks    = 0;
    ledBlink = 1;
  }
//	if(bl==0) {bl=1; LED_On(0)   ;  return;}
 // 	if(bl==1) {bl=0; LED_Off(0)   ;  }
	   ADC_RBat();
	//   b+=1;
	   
}


/*----------------------------------------------------------------------------
  MAIN function
 *----------------------------------------------------------------------------*/ 
 
int main (void) {

  LED_Config();
  BTN_Config();    
                           
   RCC->APB2ENR |= RCC_APB2ENR_ADC1EN;  //Ïîäêëþ÷àåì ÀÖÏ ê ëèíèè òàêòèðîâàíèÿ
  RCC->CFGR |= RCC_CFGR_ADCPRE;        //Ïðåääåëèòåëü íà ìàêñèìóì (íà 8)
  RCC->CFGR |= RCC_CFGR_ADCPRE_DIV8;

    ADC1->CR2 |= ADC_CR2_CAL;          //Çàïóñê êàëèáðîâêè (ýòî íóæíî ñäåëàòü ÄÎ óñòàíîâêè ADON)
    while (!(ADC1->CR2 & ADC_CR2_CAL))
    {
    }
//  ADC1->SQR3 |= (ADC_SQR3_SQ1_1 | ADC_SQR3_SQ1_3); //âûáèðàåì 10é êàíàë (PC0)
   ADC1->SQR3=16  ;	  //à âîò íèôèãà þçàåì 16 âõîä ýòî òåðìîìåòð
  ADC1->CR2 |= (ADC_CR2_EXTSEL_0 | ADC_CR2_EXTSEL_1 | ADC_CR2_EXTSEL_2 | ADC_CR2_EXTTRIG|ADC_CR2_TSVREFE);
  ADC1->CR2 |= ADC_CR2_ADON;
  //GPIOC->CRL &= ~GPIO_CRL_CNF0;                        //Àíàëîãîâûé âõîä (ýòî ÀÖÏ, 10é êàíàë)
  //GPIOC->CRL &= ~GPIO_CRL_MODE0;


	

  SysTick_Config(SystemCoreClock / 10000);       /* Setup SysTick Timer  (10ms) */
  	
  while(1) { 

	  if(adc<=adc1){
	   if(a>b) 
	   {LED_Off(1); }	
	   
		  if(a<=b) 
		  {  LED_On(1);}	
		  
					 }
					 	  if(adc>=adc1){
	   if(a>b) 
	   {LED_Off(0); }	
	   
		  if(a<=b) 
		  {  LED_On(0);}	
		  
					 }
								b= (adc1-adc)*10;
								if(b<0) b=b*-1;
								a++;
							if (a>1000) a=0;
							if(b>1000) b=1000;
				 if (BTN_Pressed()) 
					//	if(BTN_Get())
					{	    //  b += 1;
				//	b= 50-(adc1-adc);
				if(b>100) b=0;
									
									adc1=adc;
										 }




   	/*
    if (BTN_Pressed()) {
    //  ledVal += 1;
      if (ledVal > 3) ledVal = 1;
    }

    if (ledBlink == 1) {
      ledBlink  = 0;
	  ledOn    ^= 1;
	  if (ledOn == 1)
        LED_Out (ledVal);                      
      else 
        LED_Out (0);                             
	
	}	*/ 
  }
  
}

Re: STM32 Первый старт

Добавлено: Пн янв 02, 2012 19:54:31
md5sum
dinets писал(а):насочинял интерестную прожку....
с АЦП и термометром

суть в том что кнопкой сохраняю температуру.
когда температура растёт плано зажигаю зелёный
когда темперетура падает (относительно уставки сделаной кнопкой) плавно зажигается синий

плавно - програмный шим
А теперь то-же самое, но измерения проводить циклически, выборку делать DMA, по прерыванию DMA-halftransfer проверять значение и менять значение аппаратного ШИМ. Кнопку то-же прерыванием обрабатывать.
Так, чтоб основной цикл был for (;;) {}
:))) а-ля домашнее задание :beer:

Re: STM32 Первый старт

Добавлено: Пн янв 02, 2012 19:56:06
Satyr
Неправильно :)))

Основной цикл:

while(1) WFI();

Re: STM32 Первый старт

Добавлено: Вт янв 10, 2012 23:24:34
dinets
аааааа проблема проблема
осваиваю работу с прерываниями.....
значит написал вот код

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

.....
void USART1_IRQHandler (void)
{

static	 int i=0;
				 i++;
}
.........

u8 SMS[]="Hello, my name is STM32F100RB!";
   u32 tmp=0; 

 //  __enable_irq ();  // Ðàçðåøèòü ïðåðûâàíèÿ IRQ. 

   NVIC_EnableIRQ (USART1_IRQn ); 

 RCC->APB2ENR|= RCC_APB2ENR_IOPAEN; // Ðàçðåøèòü òàêòèðîâàíèå ïîðòà A.

     RCC->APB2ENR|= RCC_APB2ENR_AFIOEN; // Òàêòèðîâàíèå àëüòåðíàòèâíûõ ôóíêöèé GPIO.

     RCC->APB2ENR|= RCC_APB2ENR_USART1EN; // Âêëþ÷åíèå òàêòèðîâàíèÿ USART1.

     GPIOA->CRH |= GPIO_CRH_MODE9; // Âûâîä TX PA.9 - íà âûõîä.

     GPIOA->CRH &=~GPIO_CRH_CNF9; GPIOA->CRH |=GPIO_CRH_CNF9_1; // Àëüòåðíàòèâíûé âûõîä.

     USART1->CR1 |=(USART_CR1_RE | USART_CR1_TE); // Ðàçðåøèòü âûâîäû RX, TX - PA10, PA9.

     // Ñêîðîñòü 115.2 kbps. USARTDIV=FSYS/(16*baud) = 8e6/(16*115200) = 4,34.
     USART1->BRR=(78<<4); // Öåëàÿ ÷àñòü êîýôôèöèåíòà äåëåíèÿ USART1. 

     USART1->BRR|=125; // Äðîáíàÿ ÷àñòü*16 = 0,34*16 = 5 (îêð).
	 USART1->CR1 |=USART_CR1_TCIE | USART_CR1_RXNEIE;
	 // USART1->CR1 =USART_CR1_RXNEIE ;
     USART1->CR1 |=USART_CR1_UE; // Âêëþ÷åíèå USART1.

		    while (SMS[tmp]) // Ïîêà íå êîíåö ñòðîêè...
     {
          while (!(USART1->SR & USART_SR_TXE)) {} // Æäàòü îñâîáîæäåíèÿ áóôåðà.
          USART1->DR=SMS[tmp]; tmp++; // Îòïðàâèòü áàéò.
     }
в итоге программа зависает на функции USART1_IRQHandler постоянно её выполняя

Re: STM32 Первый старт

Добавлено: Вт янв 10, 2012 23:26:36
md5sum
dinets писал(а):аааааа проблема проблема
осваиваю работу с прерываниями.....
значит написал вот код

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

.....
void USART1_IRQHandler (void)
{

static	 int i=0;
				 i++;
}
[/quote]
В отличии от AVR, тут флаги прерываний нужно ручками очищать :))

Re: STM32 Первый старт

Добавлено: Ср янв 11, 2012 00:00:51
dinets
ещё вопросы....

а как же обработчик SysTick_Handler там ничего не очищают и всё работает?

можно по подробнее про файл startup*.s какой выбирать
почему в одних есть вызов инита в других нет

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

  LDR     R0, =SystemInit
                 BLX     R0
Две цели ... оперативка и флеш... я думал что у них Гарвардская архитектура.... как это реализованно?

Re: STM32 Первый старт

Добавлено: Ср янв 11, 2012 07:41:50
uk8amk
А таймер Systick входит в процессорное ядро, поэтому флажок очищается автоматически.
dinets писал(а):можно по подробнее про файл startup*.s какой выбирать
Лично я выбрал тот что был из пакета дискавери. Но т.к. инициализирую периферию самостоятельно то просто закомментировал вызов SystemInit.
dinets писал(а):Две цели ... оперативка и флеш... я думал что у них Гарвардская архитектура...
Привыкайте)). Меня поначалу от этого тоже сильно карежило. Прочитайте мануал по CM3 там хорошо все расписано что да как.

Re: STM32 Первый старт

Добавлено: Ср янв 11, 2012 07:48:08
md5sum
uk8amk писал(а):....Прочитайте мануал по CM3 там хорошо все расписано что да как.
Опередил...
Столько буковок удалить пришлось :(
А мануал, что-б долго не искать, называется PM0056 "STM32F10xxx/20xxx/21xxx/L1xxxx Cortex-M3 programming manual"

Re: STM32 Первый старт

Добавлено: Пн янв 23, 2012 00:04:17
dinets
игра с ШИМом и RGB светодиодами
http://www.youtube.com/watch?v=hr-696XkIBQ

Re: STM32 Первый старт

Добавлено: Пн янв 30, 2012 22:20:11
inkHunter
у кого есть шаблон проекта под keil (STM32F10X), чтобы были там стандартные библиотеки периферии? сам делаю куча ошибок, не получаеться собрать (