网站建设框架构建,网站建设设计公司+知乎,国内站长做国外网站,国内网站备案目录 1. 测速模块
2. 测试原理和单位换算
3. 定时器和中断实现测速开发和调试代码
4. 小车速度显示在OLED屏 1. 测速模块 用途#xff1a;广泛用于电机转速检测#xff0c;脉冲计数,位置限位等。有遮挡#xff0c;输出高电平#xff1b;无遮挡#xff0c;输出低电平接线…目录 1. 测速模块
2. 测试原理和单位换算
3. 定时器和中断实现测速开发和调试代码
4. 小车速度显示在OLED屏 1. 测速模块 用途广泛用于电机转速检测脉冲计数,位置限位等。有遮挡输出高电平无遮挡输出低电平接线 :VCC 接电源正极3.3-5VGND 接电源负极 DO TTL开关信号输出AO 此模块不起作用
2. 测试原理和单位换算
轮子走一圈经过一个周长C 2x3.14x半径 3.14 x 直径6.5cm对应的码盘也转了一圈码盘有20个格子每经过一个格子会遮挡高电平和不遮挡低电平 那么一个脉冲就是走了 3.14 * 6.5 cm /20 1.0205CM定时器可以设计成一秒统计脉冲数一个脉冲就是1cm假设一秒有80脉冲那么就是80cm/s
3. 定时器和中断实现测速开发和调试代码
测试数据通过串口发送到上位机
硬件接线
测速模块
VCC -- 3.3V 不能接5V否则遮挡一次会触发3次中断OUT -- PB14
cubeMX配置
代码实现
unsigned int speedCnt;void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{if (GPIO_Pin GPIO_PIN_14)if (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_14) GPIO_PIN_RESET)speedCnt;
}
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{printf(speed: %d\r\n, speedCnt);speedCnt 0;
}main函数里
HAL_TIM_Base_Start_IT(htim2);
4. 小车速度显示在OLED屏
OLED模块介绍STM32 OLED屏幕显示详解
硬件接线
SCL -- PB6SDA -- PB7
代码示例
oled.c
#include oled.h
#include i2c.h
#include oledfont.hvoid Oled_Write_Cmd(uint8_t dataCmd)
{HAL_I2C_Mem_Write(hi2c1, 0x78, 0x00, I2C_MEMADD_SIZE_8BIT,dataCmd, 1, 0xff);
}void Oled_Write_Data(uint8_t dataData)
{HAL_I2C_Mem_Write(hi2c1, 0x78, 0x40, I2C_MEMADD_SIZE_8BIT,dataData, 1, 0xff);
}void Oled_Init(void){Oled_Write_Cmd(0xAE);//--display offOled_Write_Cmd(0x00);//---set low column addressOled_Write_Cmd(0x10);//---set high column addressOled_Write_Cmd(0x40);//--set start line address Oled_Write_Cmd(0xB0);//--set page addressOled_Write_Cmd(0x81); // contract controlOled_Write_Cmd(0xFF);//--128 Oled_Write_Cmd(0xA1);//set segment remap Oled_Write_Cmd(0xA6);//--normal / reverseOled_Write_Cmd(0xA8);//--set multiplex ratio(1 to 64)Oled_Write_Cmd(0x3F);//--1/32 dutyOled_Write_Cmd(0xC8);//Com scan directionOled_Write_Cmd(0xD3);//-set display offsetOled_Write_Cmd(0x00);//Oled_Write_Cmd(0xD5);//set osc divisionOled_Write_Cmd(0x80);//Oled_Write_Cmd(0xD8);//set area color mode offOled_Write_Cmd(0x05);//Oled_Write_Cmd(0xD9);//Set Pre-Charge PeriodOled_Write_Cmd(0xF1);//Oled_Write_Cmd(0xDA);//set com pin configuartionOled_Write_Cmd(0x12);//Oled_Write_Cmd(0xDB);//set VcomhOled_Write_Cmd(0x30);//Oled_Write_Cmd(0x8D);//set charge pump enableOled_Write_Cmd(0x14);//Oled_Write_Cmd(0xAF);//--turn on oled panel
}void Oled_Screen_Clear(void){char i,n;Oled_Write_Cmd (0x20); //set memory addressing modeOled_Write_Cmd (0x02); //page addressing modefor(i0;i8;i){Oled_Write_Cmd(0xb0i); Oled_Write_Cmd(0x00); Oled_Write_Cmd(0x10); for(n0;n128;n)Oled_Write_Data(0x00); }
}void Oled_Show_Char(char row,char col,char oledChar){ //row*2-2unsigned int i;Oled_Write_Cmd(0xb0(row*2-2)); //page 0Oled_Write_Cmd(0x00(col0x0f)); //lowOled_Write_Cmd(0x10(col4)); //high for(i((oledChar-32)*16);i((oledChar-32)*168);i){Oled_Write_Data(F8X16[i]); //写数据oledTable1}Oled_Write_Cmd(0xb0(row*2-1)); //page 1Oled_Write_Cmd(0x00(col0x0f)); //lowOled_Write_Cmd(0x10(col4)); //highfor(i((oledChar-32)*168);i((oledChar-32)*1688);i){Oled_Write_Data(F8X16[i]); //写数据oledTable1}
}/******************************************************************************/
// 函数名称Oled_Show_Char
// 输入参数oledChar
// 输出参数无
// 函数功能OLED显示单个字符
/******************************************************************************/
void Oled_Show_Str(char row,char col,char *str){while(*str!0){Oled_Show_Char(row,col,*str);str;col 8; }
}main.c
extern uint8_t buf;
unsigned int speedCnt 0;
char speedMes[24]; //主程序发送速度数据的字符串缓冲区void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{if (GPIO_Pin GPIO_PIN_14)if (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_14) GPIO_PIN_RESET)speedCnt;
}void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{printf(speed: %d\r\n, speedCnt);sprintf(speedMes,speed:%2d cm/s,speedCnt);//串口数据的字符串拼装speed是格子每个格子1cmOled_Show_Str(2,2,speedMes);speedCnt 0;
}