BASIC4MCU | 질문게시판 | stm32 psd센서구동 질문
페이지 정보
작성자 수포자 작성일2023-05-29 13:58 조회481회 댓글2건본문
hbe-mcu-muit2에 달려있는 센서를 가지고 모듈의 출력 전압이 변화되는 것을 ADC를 통해 읽어 내고 이를 통하여 센서 앞에 위치 한 물체까지의 거리를 측정하는 코드인데 if를 써야될지 while을 써야되는지 모르겠습니다..
이렇게 하면 시그먼트는 뜨기 하는데 0000에서 계속 깜박입니다 항상 답변감사합니다 많은 공부가 되고있습니다
// stm32f4xx의 각 레지스터들을 정의한 헤더 파일
#include "stm32f4xx.h"
// delay 함수
static void Delay(const uint32_t Count)
{
__IO uint32_t index = 0;
for(index = (16800* Count); index !=0; index--);
}
unsigned char Font[18] = {0x3F, 0X06, 0X5B, 0X4F,
0X66, 0X6D, 0X7C, 0X07,
0X7F, 0X67, 0X77, 0X7C,
0X39, 0X5E, 0X79, 0X71,
0X08, 0X80};
uint16_t adc_data;
void Segment( int N )
{
int i;
unsigned char N1000, N100, N10, N1 ;
int Buff;
N1000 = N / 1000;
Buff = N %1000;
N100 = Buff / 100;
Buff = Buff %100;
N10= Buff/10;
N1 = Buff%10;
for( i =0 ; i <30; i++)
{
GPIO_Write(GPIOC, Font[N1000]|0x0e00);
Delay(1);
GPIO_Write(GPIOC, Font[N100]|0x0d00);
Delay(1);
GPIO_Write(GPIOC, Font[N10]|0x0b00);
Delay(1);
GPIO_Write(GPIOC, Font[N1]|0x0700);
Delay(1);
}
}
void ADC_IRQHandler(void)
{
if(ADC_GetITStatus(ADC1, ADC_IT_EOC) != RESET)
{
ADC_ClearITPendingBit(ADC1, ADC_IT_EOC);
adc_data = ADC_GetConversionValue(ADC1);
}
;}
int main()
{
GPIO_InitTypeDef GPIO_InitStructure;
ADC_InitTypeDef ADC_InitStructure;
ADC_CommonInitTypeDef ADC_CommonInitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
int Dist = 0;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC|RCC_AHB1Periph_GPIOA, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
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_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11;
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
GPIO_Init(GPIOA, &GPIO_InitStructure);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
NVIC_InitStructure.NVIC_IRQChannel = ADC_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x01;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;
ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div2;
ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled;
ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;
ADC_CommonInit(&ADC_CommonInitStructure);
ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
ADC_InitStructure.ADC_ScanConvMode = DISABLE;
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitStructure.ADC_NbrOfConversion = 1;
ADC_Init(ADC1, &ADC_InitStructure);
ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_3Cycles);
ADC_ITConfig(ADC1, ADC_IT_EOC, ENABLE);
ADC_Cmd(ADC1, ENABLE);
ADC_SoftwareStartConv(ADC1);
while(1)
{
Segment(Dist);
}
}
댓글 2
조회수 481master님의 댓글
master 작성일
while(1){ Segment(adc_data); }
}
Dist변수대신 adc_data로 세그먼트함수를 호출해야 하지 않나요?
수포자님의 댓글
수포자
네 참고해서 dist 연결하고 밑에중 한줄없어지니 작동됬습니다 감사합니다