BASIC4MCU | 질문게시판 | stm32f103 LED 밝기 제어 질문 드립니다.
페이지 정보
작성자 몽규 작성일2018-01-30 11:57 조회42,648회 댓글6건본문
현재 GPIOA에 LED를 PIN1에 연결을 다음과 같이 하였습니다.
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
GPIO_InitStruct.Pin = iSTATE_LED;
HAL_GPIO_Init(iLED_PORT, &GPIO_InitStruct);
이때 PWM을 사용하여 밝기를 제어 하려고 합니다.
pwm init 함수는 다음과 같습니다
----------------------------------------------------------------------
void PWM_Init(void)
{
//SystemCoreClock => 72,000,000 => 72MHz
TimHandle2.Instance = TIM2;
prescalerValue = (uint32_t)(SystemCoreClock / 2000000) - 1;
TimHandle2.Init.Period = PERIOD_VALUE;
TimHandle2.Init.Prescaler = prescalerValue;
TimHandle2.Init.ClockDivision = 0;
TimHandle2.Init.CounterMode = TIM_COUNTERMODE_UP;
TimHandle2.Init.RepetitionCounter = 0;
HAL_TIM_PWM_Init(&TimHandle2);
sConfig.OCMode = TIM_OCMODE_PWM1;
sConfig.OCPolarity = TIM_OCPOLARITY_HIGH;
sConfig.OCFastMode = TIM_OCFAST_DISABLE;
sConfig.OCNPolarity = TIM_OCNPOLARITY_HIGH;
sConfig.OCNIdleState = TIM_OCNIDLESTATE_RESET;
sConfig.OCIdleState = TIM_OCIDLESTATE_RESET;
sConfig.Pulse = 0;
HAL_TIM_PWM_ConfigChannel(&TimHandle2, &sConfig, TIM_CHANNEL_2);
HAL_TIM_PWM_Start(&TimHandle2, TIM_CHANNEL_2);
}-------------------------------------------------------------------
이제 아래와 같은 함수로 밝기 제어를 하려고 합니다.
void PWM_Value(int value)
{
sConfig.Pulse = value ;
HAL_TIM_PWM_ConfigChannel(&TimHandle2, &sConfig, TIM_CHANNEL_2);
HAL_TIM_PWM_Start(&TimHandle2, TIM_CHANNEL_2);
}
그러면 GPIOA의 LED를 어떻게 PWM과 연결 설정을 하고 밝기 제어를 할 수 있는지 궁금 합니다.
for(pwm=0; pwm<200; pwm++)
{
/*이 부분을 어떻게 채워야 할까요?*/
}
댓글 6
조회수 42,648master님의 댓글
master 작성일
어떤 보드를 사용 중인가요
CubeMX에 예제가 있는지 찾아보셨을까요?
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
눈에 띄는 큰 오류는 핀모드 설정입니다.
타이머로 사용해야 하니 GPIO로 설정하면 안되고 AF 모드로 설정해야겠죠
//
sConfig.Pulse = PULSE1_VALUE; /* Set the pulse value for channel 1 */
if (HAL_TIM_PWM_ConfigChannel(&TimHandle, &sConfig, TIM_CHANNEL_1) != HAL_OK){
Error_Handler(); /* Configuration Error */
}
지금 보는 예제에서는 이런 식으로 PWM 값을 설정하고 있을 것 같습니다.
if()문은 에러를 체크하기 위한 것인데 에러체크를 하지 않는다면 문장이 더 간단해지겠죠
sConfig.Pulse = PULSE1_VALUE;
HAL_TIM_PWM_ConfigChannel(&TimHandle, &sConfig, TIM_CHANNEL_1);
master님의 댓글
master 작성일
http://blog.naver.com/PostView.nhn?blogId=wararat&logNo=220729913776&categoryNo=65&parentCategoryNo=0&viewDate=¤tPage=1&postListTopCurrentPage=1&from=section
이 글의 예제를 참고하는 것이 좋겠습니다.
몽규님의 댓글
몽규 작성일아 코드 실수였습니다 AF로 바꾸지 않았던 것이 가장큰 실수였습니다 감사합니다!!!
master님의 댓글
master
답변을 다 작성하고 클릭하는 순간 글이 삭제되었군요
for()문 안에는 딜레이를 추가해야하고요
void PWM_Value(int value){
sConfig.Pulse = value ;
HAL_TIM_PWM_ConfigChannel(&TimHandle2, &sConfig, TIM_CHANNEL_2);
HAL_TIM_PWM_Start(&TimHandle2, TIM_CHANNEL_2);
}
가장 아래에 있는 HAL_TIM_PWM_Start() 함수는 처음 초기 설정할 때에만 필요합니다.
PWM 값을 변경 할 때마다 START 시켜줄 필요는 없겠죠
master님의 댓글
master
sConfig.Pulse = value ;
HAL_TIM_PWM_ConfigChannel(&TimHandle2, &sConfig, TIM_CHANNEL_2);
이렇게 두 라인으로 코드가 복잡해지기 때문에
링크 해드린 예제에서는 CCR레지스터에 직접 값을 넣은 것 같습니다.
몽규님의 댓글
몽규 작성일답변 감사합니다!