Перейти к содержанию
    

АЦП на STM32F103VBT6

Доброе время суток.

Имеется микроконтроллер STM32F103VBT6, на нём заведен ADC1 и используются 6 входных каналов на ножках PA0..PA5. Если в конфигурации установить оцифровку сигнала с пина PA0, то оцифровка проходит успешно, то же самое с пином PA1.

Ситуация меняется, если пытаюсь оцифровать PA2..PA5. Считываются нули. Ниже привожу код. Просьба подсказать в чём может быть дело и как это исправить.

Канал меняю в строчке ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_1Cycles5);. К примеру, ADC_Channel_2.


#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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Так у вас соответствующие входы не настроены.

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

 

   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);

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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, нулевой и первый каналы работают одинаково. Ну в моём случае с остальными тоже.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

 Get_Temp();
unsigned char a = temp>>4;

Между этими строчками не нужно готовности преобразования подождать?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

adnega, может быть и нужно. Тогда что получается, что время оцифровки 0-ого и 2-ого канала отличаются?

P.S. Что нужно вставить чтобы подождать?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

adnega, может быть и нужно. Тогда что получается, что время оцифровки 0-ого и 2-ого канала отличаются?

P.S. Что нужно вставить чтобы подождать?

Так неправильно, поэтому поведение может быть любым.

Зачем вам прерывание от ADC1? Просто ждите флага окончания преобразования в Get_Temp().

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

По поводу готовности преобразования, код, который и был у меня изначально

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)) - это не ожидание готовности преобразования?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну, if никого не ждет, а проверяет.

Причем проверку он делает в прерывании, а вам надо в Get_temp().

while(ADC_GetITStatus(ADC1, ADC_IT_EOC) == 0);

Изменено пользователем IgorKossak
бездумное цитирование

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Переписал 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, то это ни на что не влияет

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

думаю пришло время мануалов:)....

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

 

 

Пробовать конечно весело, но зачем гадать когда можно точно прочитать какой бит за что отвечает?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А так?

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 запретить.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если прерывания включены, но зацикливание, если отключить, то выдаются нули, как и раньше.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Попробуйте ADC_SampleTime_1Cycles5 увеличить?

Как организован аналоговый вход?

Выдает чистый ноль или с шумами в младших разрядах?

Попробуйте вывести 12 битное значение без сдвига на 4.

Попробуйте посмотреть осциллографом что делается на аналоговом входе.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Заметил странную особенность. Оставшиеся нужные мне 4 канала на самом деле работают, но вход оказывается низкоомным, а не высокоомным.

Если соединить вход микроконтроллера, идущий на ADC_ch_2 с питанием 3.3 В перемычкой, на выходе вижу 0xFF, как и должно быть.

Если соединить этот же вход с питанием через резистор 350 Ом, то на выходе вижу 0xBC (со смещёнными на 4 разрядами), мультиметром замеряю напряжение - 2.42 В. То есть получается что входное сопротивление 970 Ом, что маловато для подтяжки.

Попробовал настроить вход как обычный GPIO с подтяжкой к питанию, начал выдавать 0x06 (со смещёнными на 4 разрядами), мультиметр показывает там 80 мВ.

Есть подозрение, что сгорел внутренний защитный диод. Может всё же может быть с другим проблема??

С другими каналами такая же ситуация, кроме 0ого и 1ого.

На всякий случай текущий код

#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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я проверил бы, все ли выводы питаний и земли припаяны.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...