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

Ацп На Stm32F103Vbt6, Работают 1 И 2 Каналы Adc1, Остальные


Antidriver

Рекомендуемые сообщения

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

Имеется микроконтроллер 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_;
//send_to_uart(ind2_;
//send_to_uart(ind3_;
//send_to_uart(ind4_;
//send_to_uart(ind5_;
ind_B = 5-(ind1_B+ind2_B+ind3_B+ind4_B+ind5_;
switch (ind_
{
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);
}

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

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

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

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

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

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

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

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

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...