Так что это? Особенность МК 103 серии или ошибка в программе?
В железе ошибки вроде нет - у нас разные платы, а результат один
Ух..Zheleznjakov писал(а):2) Время преобразования при считывание по документу 5,1 мкс, но не более 17 мкс,
а как вы это окно получили?!?!dosikus писал(а):Множитель стоял 9 , выставь как на картинке.
8*9=72 однако![]()
а 100RB только 24 могет...
на лапе - ни на какой.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);
} */
}
}А теперь то-же самое, но измерения проводить циклически, выборку делать DMA, по прерыванию DMA-halftransfer проверять значение и менять значение аппаратного ШИМ. Кнопку то-же прерыванием обрабатывать.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++; // Îòïðàâèòü áàéò.
}
dinets писал(а):аааааа проблема проблема
осваиваю работу с прерываниями.....
значит написал вот кодКод: Выделить всё
..... void USART1_IRQHandler (void) { static int i=0; i++; } [/quote] В отличии от AVR, тут флаги прерываний нужно ручками очищать :))
Код: Выделить всё
LDR R0, =SystemInit
BLX R0Лично я выбрал тот что был из пакета дискавери. Но т.к. инициализирую периферию самостоятельно то просто закомментировал вызов SystemInit.dinets писал(а):можно по подробнее про файл startup*.s какой выбирать
Привыкайте)). Меня поначалу от этого тоже сильно карежило. Прочитайте мануал по CM3 там хорошо все расписано что да как.dinets писал(а):Две цели ... оперативка и флеш... я думал что у них Гарвардская архитектура...
Опередил...uk8amk писал(а):....Прочитайте мануал по CM3 там хорошо все расписано что да как.