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

4-07-2015, 18:03 От: admin Посмотрели: 454
Доброе время суток.

Имеется микроконтроллер 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);
}

Раздел: STM32

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

Обсудить на форуме


На момент добавления Ацп На Stm32F103Vbt6, Работают 1 И 2 Каналы Adc1, Остальные все ссылки были рабочие.
Все публикации статей, книг и журналов, представлены на этом сайте, исключительно для ознакомления,
авторские права на эти публикации принадлежат авторам статей, книг и издательствам журналов!
Подробно тут | Жалоба
Информация
Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.


Опрос

Ваши предпочтения в TRX


Одинарное преобразование
Двойное преобразование
Прямое преобразование
SDR
Другое
Мне всё равно

Популярные новости
Календарь новостей
«    Май 2024    »
ПнВтСрЧтПтСбВс
 12345
6789101112
13141516171819
20212223242526
2728293031