96线光电编码器测速电机用stm32c8t6实现电机实时转速的代码,但是不要HAL库函数
时间: 2023-06-12 20:02:37 浏览: 89
在HAL库下,基于stm32的交通灯设计,支持向上位机实时发送当前状态,支持紧急模式实现四面全部红灯或者全部绿灯。
5星 · 资源好评率100%
以下是使用STM32C8T6实现96线光电编码器测速电机实时转速的代码,不使用HAL库函数:
```c
#include "stm32c8t6.h"
volatile uint32_t count = 0; // 编码器计数器
volatile uint32_t speed = 0; // 电机转速
void EXTI4_15_IRQHandler(void) { // 外部中断中断服务函数
if (EXTI->PR & EXTI_PR_PR6) { // 判断是否为外部中断线6中断
count++; // 编码器计数器加1
EXTI->PR |= EXTI_PR_PR6; // 清除中断标志位
}
}
void TIM3_IRQHandler(void) { // 定时器中断服务函数
if (TIM3->SR & TIM_SR_UIF) { // 判断是否为定时器溢出中断
speed = count * 60; // 计算电机转速
count = 0; // 清零编码器计数器
TIM3->SR &= ~TIM_SR_UIF; // 清除中断标志位
}
}
int main(void) {
// 初始化GPIO端口
RCC->AHBENR |= RCC_AHBENR_GPIOAEN;
GPIOA->MODER &= ~(GPIO_MODER_MODER6); // 设置PA6为输入模式
GPIOA->PUPDR |= GPIO_PUPDR_PUPDR6_1; // 设置PA6为上拉输入
// 初始化外部中断
RCC->APB2ENR |= RCC_APB2ENR_SYSCFGEN; // 使能系统配置时钟
SYSCFG->EXTICR[1] |= SYSCFG_EXTICR2_EXTI6_PA; // 选择PA6作为外部中断线6
EXTI->IMR |= EXTI_IMR_IM6; // 使能外部中断线6
EXTI->FTSR |= EXTI_FTSR_TR6; // 下降沿触发
NVIC_EnableIRQ(EXTI4_15_IRQn); // 使能外部中断中断向量
// 初始化定时器
RCC->APB1ENR |= RCC_APB1ENR_TIM3EN; // 使能定时器3时钟
TIM3->PSC = 47999; // 设置预分频器,计数频率为1kHz
TIM3->ARR = 999; // 设置自动重载值,计数器溢出时间为1s
TIM3->DIER |= TIM_DIER_UIE; // 使能更新中断
NVIC_EnableIRQ(TIM3_IRQn); // 使能定时器中断向量
TIM3->CR1 |= TIM_CR1_CEN; // 启动定时器
while (1) {
// 电机转速在speed变量中,可以在此处进行处理
}
}
```
代码中使用外部中断来检测编码器的脉冲信号,每次检测到下降沿触发时,计数器count加1。使用定时器3来定时,每隔1秒钟计算一次电机转速。在定时器溢出中断服务函数中,将计数器count乘以60,得到电机每分钟的脉冲数,即电机转速。最后在主函数中读取speed变量的值,即可得到电机的实时转速。
阅读全文