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

 
 
> АЦП на STM32F103VBT6, Работают 1 и 2 каналы ADC1, остальные выдают нули
AntiDriver
сообщение Jul 2 2015, 14:18
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 106
Регистрация: 1-05-13
Пользователь №: 76 699



Доброе время суток.
Имеется микроконтроллер STM32F103VBT6, на нём заведен ADC1 и используются 6 входных каналов на ножках PA0..PA5. Если в конфигурации установить оцифровку сигнала с пина PA0, то оцифровка проходит успешно, то же самое с пином PA1.
Ситуация меняется, если пытаюсь оцифровать PA2..PA5. Считываются нули. Ниже привожу код. Просьба подсказать в чём может быть дело и как это исправить.
Канал меняю в строчке ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_1Cycles5);. К примеру, ADC_Channel_2.
CODE


#include "stm32f10x_rcc.h"
#include "stm32f10x_adc.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_usart.h"
#include "misc.h"
#include "delay.h"

void SetupUSART(void);
void send_to_uart(uint8_t data);

void ADC1_2_IRQHandler(void);
void Get_Temp(void);

uint8_t ind1_B;
uint8_t ind2_B;
uint8_t ind3_B;
uint8_t ind4_B;
uint8_t ind5_B;
uint8_t ind1_C;
uint8_t ind2_C;
uint8_t ind3_C;
uint8_t ind4_C;
uint8_t ind5_C;
uint8_t ind1_D;
uint8_t ind2_D;
uint8_t ind3_D;
uint8_t ind4_D;
uint8_t ind5_D;

uint8_t ind_B;

static volatile uint16_t temp=0;


int main(void)
{


SysTick_Config(8000);

RCC_APB2PeriphClockCmd(RCC_APB2ENR_AFIOEN, ENABLE); // ??

GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);
//GPIO_PinRemapConfig(GPIO_Remap_SWJ_NoJTRST, ENABLE);
//GPIO_PinRemapConfig(GPIO_Remap_USART2, DISABLE);
//RCC->APB2ENR |= RCC_APB2ENR_AFIOEN;// ??
//AFIO->MAPR |= AFIO_MAPR_SWJ_CFG_JTAGDISABLE; // ?? disable JTAG
GPIO_InitTypeDef GPIO_InitStructure;

// PORTA
// input
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = /*GPIO_Pin_0 | GPIO_Pin_1 | */GPIO_Pin_2 |
GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 |
GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);
// alternative
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1/* | GPIO_Pin_2*/;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOA, &GPIO_InitStructure);


// PORTB
// input
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_3 | GPIO_Pin_5 | GPIO_Pin_8;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOB, &GPIO_InitStructure);
// output
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_4 | GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOB, &GPIO_InitStructure);

// PORTC
// input
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_4;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOC, &GPIO_InitStructure);
// output
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_13;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOC, &GPIO_InitStructure);

// PORTD
// input
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOD, &GPIO_InitStructure);
// alternative
GPIO_InitStructure.GPIO_Pin = (GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15); // PWM output pins
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOD, &GPIO_InitStructure);

// PORTE
// input
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOE, &GPIO_InitStructure);
// output
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_5 | GPIO_Pin_8 | GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOE, &GPIO_InitStructure);

SetupUSART();

// TIM4
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE); // Clock to PORTD for TIM4
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE); // Clock to TIM4
GPIO_PinRemapConfig(GPIO_Remap_TIM4, ENABLE);

TIM4->CCER |= (TIM_CCER_CC1E|TIM_CCER_CC2E|TIM_CCER_CC3E|TIM_CCER_CC4E); // Enable all PWM outputs

TIM4->CCMR1|= (TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_2); //Forward PWM for ch1 TIM4
TIM4->CCMR1|= (TIM_CCMR1_OC2M_1 | TIM_CCMR1_OC2M_2); //Forward PWM for ch2 TIM4
TIM4->CCMR2|= (TIM_CCMR2_OC3M_1 | TIM_CCMR2_OC3M_2); //Forward PWM for ch3 TIM4
TIM4->CCMR2|= (TIM_CCMR2_OC4M_1 | TIM_CCMR2_OC4M_2); //Forward PWM for ch4 TIM4

TIM4->CR1 |= TIM_CR1_CEN;
TIM4->CCR1 = 65536/5; // Duty cycle PWM1 (Avr voltage = 1.65 V)
TIM4->CCR2 = 65536/4; // Duty cycle PWM2
TIM4->CCR3 = 65536/3; // Duty cycle PWM3
TIM4->CCR4 = 65536/2; // Duty cycle PWM4

// ADC
RCC_ADCCLKConfig(RCC_PCLK2_Div8);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = ADC1_2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

ADC_DeInit(ADC1);

ADC_InitTypeDef ADC_InitStructure;
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
ADC_InitStructure.ADC_ScanConvMode = DISABLE;
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitStructure.ADC_NbrOfChannel = 1;
ADC_Init(ADC1, &ADC_InitStructure);

ADC_ITConfig(ADC1, ADC_IT_EOC, ENABLE);
NVIC_Init(&NVIC_InitStructure);
ADC_Cmd(ADC1, ENABLE);
//ADC_TempSensorVrefintCmd(ENABLE);
ADC_ResetCalibration(ADC1);
while (ADC_GetResetCalibrationStatus(ADC1)) { };
ADC_StartCalibration(ADC1);
while (ADC_GetCalibrationStatus(ADC1)) { };

GPIO_SetBits(GPIOE,GPIO_Pin_1);

while(1)
{

GPIO_SetBits(GPIOC,GPIO_Pin_6);
//uint8_t pa2 = GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_2);
//send_to_uart(pa2);

//GPIO_SetBits(GPIOB,GPIO_Pin_4); // always 1
/*/chB
GPIO_SetBits(GPIOB,GPIO_Pin_6);
GPIO_SetBits(GPIOB,GPIO_Pin_4);
GPIO_SetBits(GPIOB,GPIO_Pin_7);
GPIO_SetBits(GPIOB,GPIO_Pin_9);
GPIO_SetBits(GPIOE,GPIO_Pin_0);
*/

Delay_ms(500);

GPIO_ResetBits(GPIOC,GPIO_Pin_6);
//GPIO_ResetBits(GPIOB,GPIO_Pin_4); // always 1

/*/chB
GPIO_ResetBits(GPIOB,GPIO_Pin_6);
GPIO_ResetBits(GPIOB,GPIO_Pin_4);
GPIO_ResetBits(GPIOB,GPIO_Pin_7);
GPIO_ResetBits(GPIOB,GPIO_Pin_9);
GPIO_ResetBits(GPIOE,GPIO_Pin_0);
*/

Delay_ms(500);

ind1_B = GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_6); // ok
ind2_B = GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_7); // ok
ind3_B = GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_3); // ok //(?) always 0
ind4_B = GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_5); // ok
ind5_B = GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_8); // ok
ind1_C = GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2); // ok
ind2_C = GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3); // ok
ind3_C = GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_4); // ok
ind4_C = GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_6); // ok
ind5_C = GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_1); // ok
ind1_D = GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_6); // ok
ind2_D = GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_7); // ok
ind3_D = GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_4); // ok
ind4_D = GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_0); // ok
ind5_D = GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_7); // ok

//send_to_uart(ind1_B);
//send_to_uart(ind2_B);
//send_to_uart(ind3_B);
//send_to_uart(ind4_B);
//send_to_uart(ind5_B);
ind_B = 5-(ind1_B+ind2_B+ind3_B+ind4_B+ind5_B);
switch (ind_B)
{
case 0:
GPIO_ResetBits(GPIOB,GPIO_Pin_6); // sel1_B
GPIO_ResetBits(GPIOB,GPIO_Pin_4); // sel2_B
GPIO_ResetBits(GPIOB,GPIO_Pin_7); // sel3_B
GPIO_ResetBits(GPIOB,GPIO_Pin_9); // sel4_B
GPIO_ResetBits(GPIOE,GPIO_Pin_0); // sel5_B
break;
case 1:
GPIO_SetBits(GPIOB,GPIO_Pin_6); // sel1_B
GPIO_ResetBits(GPIOB,GPIO_Pin_4); // sel2_B
GPIO_ResetBits(GPIOB,GPIO_Pin_7); // sel3_B
GPIO_ResetBits(GPIOB,GPIO_Pin_9); // sel4_B
GPIO_ResetBits(GPIOE,GPIO_Pin_0); // sel5_B
break;
case 2:
GPIO_ResetBits(GPIOB,GPIO_Pin_6); // sel1_B
GPIO_SetBits(GPIOB,GPIO_Pin_4); // sel2_B
GPIO_ResetBits(GPIOB,GPIO_Pin_7); // sel3_B
GPIO_ResetBits(GPIOB,GPIO_Pin_9); // sel4_B
GPIO_ResetBits(GPIOE,GPIO_Pin_0); // sel5_B
break;
case 3:
GPIO_ResetBits(GPIOB,GPIO_Pin_6); // sel1_B
GPIO_ResetBits(GPIOB,GPIO_Pin_4); // sel2_B
GPIO_SetBits(GPIOB,GPIO_Pin_7); // sel3_B
GPIO_ResetBits(GPIOB,GPIO_Pin_9); // sel4_B
GPIO_ResetBits(GPIOE,GPIO_Pin_0); // sel5_B
break;
case 4:
GPIO_ResetBits(GPIOB,GPIO_Pin_6); // sel1_B
GPIO_ResetBits(GPIOB,GPIO_Pin_4); // sel2_B
GPIO_ResetBits(GPIOB,GPIO_Pin_7); // sel3_B
GPIO_SetBits(GPIOB,GPIO_Pin_9); // sel4_B
GPIO_ResetBits(GPIOE,GPIO_Pin_0); // sel5_B
break;
case 5:
GPIO_ResetBits(GPIOB,GPIO_Pin_6); // sel1_B
GPIO_ResetBits(GPIOB,GPIO_Pin_4); // sel2_B
GPIO_ResetBits(GPIOB,GPIO_Pin_7); // sel3_B
GPIO_ResetBits(GPIOB,GPIO_Pin_9); // sel4_B
GPIO_SetBits(GPIOE,GPIO_Pin_0); // sel5_B
break;
}
Get_Temp();
unsigned char a = temp>>4;
send_to_uart(a);
send_to_uart(0xFF);
}
}

void ADC1_2_IRQHandler(void) {
if (ADC_GetITStatus(ADC1, ADC_IT_EOC)) {
ADC_ClearITPendingBit(ADC1, ADC_IT_EOC);
temp = ADC_GetConversionValue(ADC1);
}
}

void Get_Temp(void)
{
ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_1Cycles5);
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
}



void send_to_uart(uint8_t data)
{
while(!(USART1->SR & USART_SR_TC));
USART1->DR=data;
}

void SetupUSART()

{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
//RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART2,ENABLE);
//RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;

/* Configure USART1 Tx (PA.09) as alternate function push-pull */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);

/* Configure USART1 Rx (PA.10) as input floating */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);


USART_InitStructure.USART_BaudRate = 115200;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_DeInit(USART1);

USART_Init(USART1, &USART_InitStructure);
USART_Cmd(USART1, ENABLE);
}




Сообщение отредактировал AntiDriver - Jul 2 2015, 14:20
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 14)
ivan2006
сообщение Jul 2 2015, 20:53
Сообщение #2


Участник
*

Группа: Свой
Сообщений: 45
Регистрация: 8-01-06
Из: Петербург
Пользователь №: 12 944



Так у вас соответствующие входы не настроены.
PA0 и PA1 - настроены как аналоговые, а PA2 и далее - как цифровые, с них 0 и читается.

CODE

GPIO_InitStructure.GPIO_Pin = /*GPIO_Pin_0 | GPIO_Pin_1 | */GPIO_Pin_2 |
GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 |
GPIO_Pin_6 | GPIO_Pin_7;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);
// alternative
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1/* | GPIO_Pin_2*/;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOA, &GPIO_InitStructure);

Go to the top of the page
 
+Quote Post
AntiDriver
сообщение Jul 3 2015, 05:49
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 106
Регистрация: 1-05-13
Пользователь №: 76 699



ivan2006, дело как раз в том, что это не влияет. Замена на
Код
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;

не приводит к положительным результатам. Даже наблюдал такой факт, что не важно как у меня настроен пин, как GPIO_Mode_IN_FLOATING или GPIO_Mode_AIN, нулевой и первый каналы работают одинаково. Ну в моём случае с остальными тоже.
Go to the top of the page
 
+Quote Post
adnega
сообщение Jul 3 2015, 06:55
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Код
Get_Temp();
unsigned char a = temp>>4;

Между этими строчками не нужно готовности преобразования подождать?
Go to the top of the page
 
+Quote Post
AntiDriver
сообщение Jul 3 2015, 07:14
Сообщение #5


Частый гость
**

Группа: Участник
Сообщений: 106
Регистрация: 1-05-13
Пользователь №: 76 699



adnega, может быть и нужно. Тогда что получается, что время оцифровки 0-ого и 2-ого канала отличаются?
P.S. Что нужно вставить чтобы подождать?
Go to the top of the page
 
+Quote Post
adnega
сообщение Jul 3 2015, 07:30
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Цитата(AntiDriver @ Jul 3 2015, 10:14) *
adnega, может быть и нужно. Тогда что получается, что время оцифровки 0-ого и 2-ого канала отличаются?
P.S. Что нужно вставить чтобы подождать?

Так неправильно, поэтому поведение может быть любым.
Зачем вам прерывание от ADC1? Просто ждите флага окончания преобразования в Get_Temp().
Go to the top of the page
 
+Quote Post
AntiDriver
сообщение Jul 3 2015, 07:51
Сообщение #7


Частый гость
**

Группа: Участник
Сообщений: 106
Регистрация: 1-05-13
Пользователь №: 76 699



По поводу готовности преобразования, код, который и был у меня изначально
Код
void ADC1_2_IRQHandler(void) {
    if (ADC_GetITStatus(ADC1, ADC_IT_EOC)) {
        ADC_ClearITPendingBit(ADC1, ADC_IT_EOC);
        temp = ADC_GetConversionValue(ADC1);
    }
}

Разве if (ADC_GetITStatus(ADC1, ADC_IT_EOC)) - это не ожидание готовности преобразования?
Go to the top of the page
 
+Quote Post
adnega
сообщение Jul 3 2015, 08:38
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Ну, if никого не ждет, а проверяет.
Причем проверку он делает в прерывании, а вам надо в Get_temp().
Код
while(ADC_GetITStatus(ADC1, ADC_IT_EOC) == 0);


Сообщение отредактировал IgorKossak - Jul 3 2015, 13:28
Причина редактирования: бездумное цитирование
Go to the top of the page
 
+Quote Post
AntiDriver
сообщение Jul 3 2015, 09:36
Сообщение #9


Частый гость
**

Группа: Участник
Сообщений: 106
Регистрация: 1-05-13
Пользователь №: 76 699



Переписал get_temp
Код
void Get_Temp(void)
{
    while(ADC_GetITStatus(ADC1, ADC_IT_EOC) == 0)
    {
        ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 1, ADC_SampleTime_1Cycles5);
        ADC_SoftwareStartConvCmd(ADC1, ENABLE);
    }
}


В итоге зацикливание. Если поставить 1, то это ни на что не влияет
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Jul 3 2015, 10:08
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



думаю пришло время мануаловsm.gif....
если очень не хочется мануалов, прочтите в начале HAL_ADC комментарии, там идет четкая последовательность чего надо настроить и как чтобы все заработало.


Пробовать конечно весело, но зачем гадать когда можно точно прочитать какой бит за что отвечает?
Go to the top of the page
 
+Quote Post
adnega
сообщение Jul 3 2015, 17:24
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



А так?
Код
void Get_Temp(void)
{
    ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 1, ADC_SampleTime_1Cycles5); // сконфигурировали
    ADC_SoftwareStartConvCmd(ADC1, ENABLE); // запустили
    while(ADC_GetITStatus(ADC1, ADC_IT_EOC) == 0); // подождали
    temp = ADC_GetConversionValue(ADC1); // считали
}


Прерывание от ADC1 запретить.
Go to the top of the page
 
+Quote Post
AntiDriver
сообщение Jul 4 2015, 21:12
Сообщение #12


Частый гость
**

Группа: Участник
Сообщений: 106
Регистрация: 1-05-13
Пользователь №: 76 699



Если прерывания включены, но зацикливание, если отключить, то выдаются нули, как и раньше.
Go to the top of the page
 
+Quote Post
adnega
сообщение Jul 5 2015, 07:45
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Попробуйте ADC_SampleTime_1Cycles5 увеличить?
Как организован аналоговый вход?
Выдает чистый ноль или с шумами в младших разрядах?
Попробуйте вывести 12 битное значение без сдвига на 4.
Попробуйте посмотреть осциллографом что делается на аналоговом входе.
Go to the top of the page
 
+Quote Post
AntiDriver
сообщение Jul 5 2015, 19:12
Сообщение #14


Частый гость
**

Группа: Участник
Сообщений: 106
Регистрация: 1-05-13
Пользователь №: 76 699



Заметил странную особенность. Оставшиеся нужные мне 4 канала на самом деле работают, но вход оказывается низкоомным, а не высокоомным.
Если соединить вход микроконтроллера, идущий на ADC_ch_2 с питанием 3.3 В перемычкой, на выходе вижу 0xFF, как и должно быть.
Если соединить этот же вход с питанием через резистор 350 Ом, то на выходе вижу 0xBC (со смещёнными на 4 разрядами), мультиметром замеряю напряжение - 2.42 В. То есть получается что входное сопротивление 970 Ом, что маловато для подтяжки.
Попробовал настроить вход как обычный GPIO с подтяжкой к питанию, начал выдавать 0x06 (со смещёнными на 4 разрядами), мультиметр показывает там 80 мВ.
Есть подозрение, что сгорел внутренний защитный диод. Может всё же может быть с другим проблема??
С другими каналами такая же ситуация, кроме 0ого и 1ого.
На всякий случай текущий код
CODE

#include "stm32f10x_rcc.h"
#include "stm32f10x_adc.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_usart.h"
#include "misc.h"
#include "delay.h"

void SetupUSART(void);
void send_to_uart(uint8_t data);

void ADC1_2_IRQHandler(void);
void Get_Temp(void);

uint8_t ind1_B;
uint8_t ind2_B;
uint8_t ind3_B;
uint8_t ind4_B;
uint8_t ind5_B;
uint8_t ind1_C;
uint8_t ind2_C;
uint8_t ind3_C;
uint8_t ind4_C;
uint8_t ind5_C;
uint8_t ind1_D;
uint8_t ind2_D;
uint8_t ind3_D;
uint8_t ind4_D;
uint8_t ind5_D;

uint8_t ind_B;

static volatile uint16_t temp=0;


int main(void)
{


SysTick_Config(8000);

RCC_APB2PeriphClockCmd(RCC_APB2ENR_AFIOEN, ENABLE); // ??

GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);
//GPIO_PinRemapConfig(GPIO_Remap_SWJ_NoJTRST, ENABLE);
//GPIO_PinRemapConfig(GPIO_Remap_USART2, DISABLE);
//RCC->APB2ENR |= RCC_APB2ENR_AFIOEN;// ??
//AFIO->MAPR |= AFIO_MAPR_SWJ_CFG_JTAGDISABLE; // ?? disable JTAG
GPIO_InitTypeDef GPIO_InitStructure;

// PORTA
// input
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = /*GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 |*/
GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 |
GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);
// alternative
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOA, &GPIO_InitStructure);


// PORTB
// input
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_3 | GPIO_Pin_5 | GPIO_Pin_8;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOB, &GPIO_InitStructure);
// output
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_4 | GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOB, &GPIO_InitStructure);

// PORTC
// input
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_4;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOC, &GPIO_InitStructure);
// output
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_13;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOC, &GPIO_InitStructure);

// PORTD
// input
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOD, &GPIO_InitStructure);
// alternative
GPIO_InitStructure.GPIO_Pin = (GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15); // PWM output pins
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOD, &GPIO_InitStructure);

// PORTE
// input
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOE, &GPIO_InitStructure);
// output
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_5 | GPIO_Pin_8 | GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOE, &GPIO_InitStructure);

SetupUSART();

// TIM4
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE); // Clock to PORTD for TIM4
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE); // Clock to TIM4
GPIO_PinRemapConfig(GPIO_Remap_TIM4, ENABLE);

TIM4->CCER |= (TIM_CCER_CC1E|TIM_CCER_CC2E|TIM_CCER_CC3E|TIM_CCER_CC4E); // Enable all PWM outputs

TIM4->CCMR1|= (TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_2); //Forward PWM for ch1 TIM4
TIM4->CCMR1|= (TIM_CCMR1_OC2M_1 | TIM_CCMR1_OC2M_2); //Forward PWM for ch2 TIM4
TIM4->CCMR2|= (TIM_CCMR2_OC3M_1 | TIM_CCMR2_OC3M_2); //Forward PWM for ch3 TIM4
TIM4->CCMR2|= (TIM_CCMR2_OC4M_1 | TIM_CCMR2_OC4M_2); //Forward PWM for ch4 TIM4

TIM4->CR1 |= TIM_CR1_CEN;
TIM4->CCR1 = 65536/5; // Duty cycle PWM1 (Avr voltage = 1.65 V)
TIM4->CCR2 = 65536/4; // Duty cycle PWM2
TIM4->CCR3 = 65536/3; // Duty cycle PWM3
TIM4->CCR4 = 65536/2; // Duty cycle PWM4

// ADC
RCC_ADCCLKConfig(RCC_PCLK2_Div8);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = ADC1_2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

ADC_DeInit(ADC1);

ADC_InitTypeDef ADC_InitStructure;
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
ADC_InitStructure.ADC_ScanConvMode = DISABLE;
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitStructure.ADC_NbrOfChannel = 1;
ADC_Init(ADC1, &ADC_InitStructure);

ADC_ITConfig(ADC1, ADC_IT_EOC, ENABLE);
NVIC_Init(&NVIC_InitStructure);
ADC_Cmd(ADC1, ENABLE);
//ADC_TempSensorVrefintCmd(ENABLE);
ADC_ResetCalibration(ADC1);
while (ADC_GetResetCalibrationStatus(ADC1)) { };
ADC_StartCalibration(ADC1);
while (ADC_GetCalibrationStatus(ADC1)) { };

GPIO_SetBits(GPIOE,GPIO_Pin_1);

while(1)
{

GPIO_SetBits(GPIOC,GPIO_Pin_6);

Delay_ms(2000);

GPIO_ResetBits(GPIOC,GPIO_Pin_6);

Delay_ms(2000);

ind1_B = GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_6); // ok
ind2_B = GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_7); // ok
ind3_B = GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_3); // ok //(?) always 0
ind4_B = GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_5); // ok
ind5_B = GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_8); // ok
ind1_C = GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2); // ok
ind2_C = GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3); // ok
ind3_C = GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_4); // ok
ind4_C = GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_6); // ok
ind5_C = GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_1); // ok
ind1_D = GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_6); // ok
ind2_D = GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_7); // ok
ind3_D = GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_4); // ok
ind4_D = GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_0); // ok
ind5_D = GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_7); // ok

ind_B = 5-(ind1_B+ind2_B+ind3_B+ind4_B+ind5_B);
switch (ind_B)
{
case 0:
GPIO_ResetBits(GPIOB,GPIO_Pin_6); // sel1_B
GPIO_ResetBits(GPIOB,GPIO_Pin_4); // sel2_B
GPIO_ResetBits(GPIOB,GPIO_Pin_7); // sel3_B
GPIO_ResetBits(GPIOB,GPIO_Pin_9); // sel4_B
GPIO_ResetBits(GPIOE,GPIO_Pin_0); // sel5_B
break;
case 1:
GPIO_SetBits(GPIOB,GPIO_Pin_6); // sel1_B
GPIO_ResetBits(GPIOB,GPIO_Pin_4); // sel2_B
GPIO_ResetBits(GPIOB,GPIO_Pin_7); // sel3_B
GPIO_ResetBits(GPIOB,GPIO_Pin_9); // sel4_B
GPIO_ResetBits(GPIOE,GPIO_Pin_0); // sel5_B
break;
case 2:
GPIO_ResetBits(GPIOB,GPIO_Pin_6); // sel1_B
GPIO_SetBits(GPIOB,GPIO_Pin_4); // sel2_B
GPIO_ResetBits(GPIOB,GPIO_Pin_7); // sel3_B
GPIO_ResetBits(GPIOB,GPIO_Pin_9); // sel4_B
GPIO_ResetBits(GPIOE,GPIO_Pin_0); // sel5_B
break;
case 3:
GPIO_ResetBits(GPIOB,GPIO_Pin_6); // sel1_B
GPIO_ResetBits(GPIOB,GPIO_Pin_4); // sel2_B
GPIO_SetBits(GPIOB,GPIO_Pin_7); // sel3_B
GPIO_ResetBits(GPIOB,GPIO_Pin_9); // sel4_B
GPIO_ResetBits(GPIOE,GPIO_Pin_0); // sel5_B
break;
case 4:
GPIO_ResetBits(GPIOB,GPIO_Pin_6); // sel1_B
GPIO_ResetBits(GPIOB,GPIO_Pin_4); // sel2_B
GPIO_ResetBits(GPIOB,GPIO_Pin_7); // sel3_B
GPIO_SetBits(GPIOB,GPIO_Pin_9); // sel4_B
GPIO_ResetBits(GPIOE,GPIO_Pin_0); // sel5_B
break;
case 5:
GPIO_ResetBits(GPIOB,GPIO_Pin_6); // sel1_B
GPIO_ResetBits(GPIOB,GPIO_Pin_4); // sel2_B
GPIO_ResetBits(GPIOB,GPIO_Pin_7); // sel3_B
GPIO_ResetBits(GPIOB,GPIO_Pin_9); // sel4_B
GPIO_SetBits(GPIOE,GPIO_Pin_0); // sel5_B
break;
}
Get_Temp();
unsigned char a = temp>>4;
send_to_uart(a);
send_to_uart(0xFF);
}
}

void ADC1_2_IRQHandler(void) {
if (ADC_GetITStatus(ADC1, ADC_IT_EOC)) {
ADC_ClearITPendingBit(ADC1, ADC_IT_EOC);
temp = ADC_GetConversionValue(ADC1);
}
}

void Get_Temp(void)
{
ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 1, ADC_SampleTime_1Cycles5);
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
}



void send_to_uart(uint8_t data)
{
while(!(USART1->SR & USART_SR_TC));
USART1->DR=data;
}

void SetupUSART()

{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
//RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART2,ENABLE);
//RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;

/* Configure USART1 Tx (PA.09) as alternate function push-pull */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);

/* Configure USART1 Rx (PA.10) as input floating */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);


USART_InitStructure.USART_BaudRate = 115200;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_DeInit(USART1);

USART_Init(USART1, &USART_InitStructure);
USART_Cmd(USART1, ENABLE);
}




Сообщение отредактировал AntiDriver - Jul 5 2015, 20:19
Go to the top of the page
 
+Quote Post
ViKo
сообщение Jul 6 2015, 04:44
Сообщение #15


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Я проверил бы, все ли выводы питаний и земли припаяны.
Go to the top of the page
 
+Quote Post

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

 


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


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