OC : 출력비교 모드는 카운터(CNT)의 값이 캡쳐/비교기에 설정된 (CCRx)값과 일치할 때 인터럽트 또는 해당 핀에 출력을 발생시키는 모드이다.
이전에 이어서 타이머 OC 모드에서 핀의 출력을 사용하는 버전이다.
핀 출력을 쓰는 모드로 설정했기 때문에 핀이 잡힌다.
PSC를 9000-1로 해서 10KHz로 분주하고 ARR은 16비트 카운터 타이머의 최대값인 0xffff-1로 한다. 이렇게 하면 업데이트 인터럽트가 6.5535초 마다 발생할 거다 하지만 업데이트 인터럽트는 안쓴다.
모든채널을 OC 인터럽트 발생시 출력이 토글되게끔 설정하고 CCR값은 위와 같이 설정한다.
소스코드
/* USER CODE BEGIN 2 */
HAL_TIM_OC_Start_IT(&htim3, TIM_CHANNEL_1);
HAL_TIM_OC_Start_IT(&htim3, TIM_CHANNEL_2);
HAL_TIM_OC_Start_IT(&htim3, TIM_CHANNEL_3);
HAL_TIM_OC_Start_IT(&htim3, TIM_CHANNEL_4);
/* USER CODE END 2 */
...
/* USER CODE BEGIN 0 */
void HAL_TIM_OC_DelayElapsedCallback(TIM_HandleTypeDef *htim)
{
uint32_t capture = 0;
if(htim->Instance == TIM3 && htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)
{
//capture = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1);
//__HAL_TIM_SET_COMPARE(htim, TIM_CHANNEL_1, capture + 10000-1);
capture = TIM3->CCR1;
TIM3->CCR1 = capture + 10000-1;
//0.5hz
}
if(htim->Instance == TIM3 && htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2)
{
//capture = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_2);
//__HAL_TIM_SET_COMPARE(htim, TIM_CHANNEL_2, capture + 5000-1);
capture = TIM3->CCR2;
TIM3->CCR2 = capture + 5000-1;
//1hz
}
if(htim->Instance == TIM3 && htim->Channel == HAL_TIM_ACTIVE_CHANNEL_3){
//capture = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_3);
//__HAL_TIM_SET_COMPARE(htim, TIM_CHANNEL_3, capture + 2500-1);
capture = TIM3->CCR3;
TIM3->CCR3 = capture + 2500-1;
//2hz
}
if(htim->Instance == TIM3 && htim->Channel == HAL_TIM_ACTIVE_CHANNEL_4){
//capture = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_4);
//__HAL_TIM_SET_COMPARE(htim, TIM_CHANNEL_4, capture + 1250-1);
capture = TIM3->CCR4;
TIM3->CCR4 = capture + 1250-1;
//4hz
}
}
/* USER CODE END 0 */
ARR이 최대니까 CCR값을 초기설정값만큼 다시 더해주는 식으로 코드를 짰다.
예를 들어 첫번째 채널을 보면, 동일한 간격으로 토글이 되니 듀티비는 당연히 50%이고, 분주한 타이머 클락값이 10KHz 인데 CCR을 10000-1로 해주니까 1Hz로 출력이 토글되고 해당 펄스의 주파수는 그 절반인 0.5Hz가 된다.
오실로스코프로 시간축 한칸의 스케일을 조정해서 주파수가 맞게 나오는지 확인도 해봤는데 미처 영상을 못찍었다.
'임베디드 개발 > STM32 (ARM Cortex-M)' 카테고리의 다른 글
STM32 ] 자율주행 코드 짜기 - 프로젝트 준비과정 (6) (0) | 2022.07.25 |
---|---|
STM32 ] SPI 통신 사용하기 (0) | 2022.07.24 |
STM32 ] TIMER OC (Output Compare No Output) 사용 예제 (0) | 2022.07.21 |
STM32 ] 어플과 STM32간 블루투스 통신을 통한 데이터 송수신 - 프로젝트 준비과정 (5) (2) | 2022.07.19 |
STM32 ] BLDC 모터 제어 - 프로젝트 준비과정 (4) (6) | 2022.07.19 |