
CubeMX_FreeRTOS+流水灯
sin函数+延迟PWM控制呼吸灯
void Task_Main_Start(void const * argument)
{
/* USER CODE BEGIN Task_Main_Start */
/* Infinite loop */
MX_GPIO_Init();
for(;;)
{
for(uint8_t i=0;i<100;i++)
{
osDelay(20);
BrightNess=sin(i*(3.1415926/100));
}
osDelay(1);
}
/* USER CODE END Task_Main_Start */
}
void LED_PWM_Start(void const * argument)
{
/* USER CODE BEGIN LED_PWM_Start */
/* Infinite loop */
for(;;)
{
LED_Display(0X02);
osDelay(BrightNess*20);//pwm控制,延时周期20ms
LED_Display(0X00);
osDelay(20-BrightNess*20);
osDelay(1);
}
/* USER CODE END LED_PWM_Start */
}
HC05蓝牙透传
配其中一个蓝牙为主模式
操作办法为:按住蓝牙模块按钮在上电后(蓝牙指示灯慢闪),
PC上串口助手发送:AT+ROLE=1加回车(波特率38400),蓝牙模块返回OK就成功
配其中一个蓝牙为从模式(默认为从机)
操作办法为:按住蓝牙模块按钮在上电后(蓝牙指示灯慢闪),
PC上串口助手发送:AT+ROLE=0加回车(波特率38400),蓝牙模块返回OK就成功
修改名字
输入AT+NAME=XXX加回车,蓝牙返回OK表示成功
修改波特率
输入AT+UART=115200,1,2加回车,蓝牙返回OK表示成功
MPU6050(6轴)
需要配套.c.h文件
初始化
float Pitch,Roll,Yaw; // Pitch:俯仰角,Roll:横滚角,Yaw:偏航角
short gyrox,gyroy,gyroz; // 角速度
short aacx,aacy,aacz; // 加速度
//------MPU6050测试-----
//----iic读取MUP器件ID----
uint8_t recv = 0x00;
HAL_I2C_Mem_Read(&hi2c2, (0x68 << 1), 0x75, I2C_MEMADD_SIZE_8BIT, &recv, 1, 0xfff);//句柄,MUP地址,器件ID寄存器
if (recv == 0x68)
{
OLED_ShowString(0,12,"recv-ok",8);
}
else
{
OLED_ShowString(0,12,"recv-no",8);
}
//-----DMP初始化----
while(mpu_dmp_init())//成功返回0,否则返回1
{
uint8_t res;
res = mpu_dmp_init();
HAL_Delay(300);
OLED_ShowString(0,11,"ing---",8);
}
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, 0); //打开PC13 LED
Start_Flag = 1; //标志系统初始化成功
读取角度,角速度
mpu_dmp_get_data(&Pitch,&Roll,&Yaw); // 读取角度 MPU_Get_Gyroscope(&gyrox,&gyroy,&gyroz); // 读取角速度 MPU_Get_Accelerometer(&aacx,&aacy,&aacz); // 读取加速度
控制转向特定角度
if(Yaw<80)
Left();//左转90度
if(Yaw<175)//
Left();//左转180度
打印数据
sprintf((char *)String,"Pitch:%.2f",Pitch);//0300
OLED_ShowString(16,8,String,8);
sprintf((char *)String,"Roll :%.2f",Roll);//0300
OLED_ShowString(16,10,String,8);
sprintf((char *)String,"Yaw :%.2f",Yaw);//0300
OLED_ShowString(16,12,String,8);
//-63 -21 -30
sprintf((char *)String,"gyrox:%d",gyrox);//0300
OLED_ShowString(16,8,String,8);
sprintf((char *)String,"gyroy:%d",gyroy);//0300
OLED_ShowString(16,10,String,8);
sprintf((char *)String,"gyroz:%d",gyroz);//0300
OLED_ShowString(16,12,String,8);
sprintf((char *)String,"aacx:%d ",aacx);//0300
OLED_ShowString(16,8,String,8);
sprintf((char *)String,"aacy:%d ",aacy);//0300
OLED_ShowString(16,10,String,8);
sprintf((char *)String,"aacz:%d ",aacz);//0300
OLED_ShowString(16,12,String,8);
OLED食用
在使用OLED时,uint8_t String[10]={0};要放到主任务里面声明,不然OLED不会实时更新数据
PCtolLCD2002取字模设置
OLED_ShowCHinese(18,0,0);
OLED_ShowCHinese(36,0,1);
OLED_ShowCHinese(54,0,2);
取图片设置
函数OLED_DrawBMP(unsigned char x0, unsigned char y0,unsigned char x1, unsigned char y1,unsigned char BMP[])
x0是要显示的开始列,x1为结束列,如果上方的输出图像大小为(54,64),
那么起始列和结束列的差必须为54,也就是x1-x0=54,同理(y1-y0)*8=64
最大128*64
显示num
x范围【0~127】,y范围【0~7】
一些使用代码
头文件
#include "stdio.h"
#include "math.h"
#include "oled.h"
#include "i2c.h"
初始化
//初始化oled屏幕
OLED_Init();
//开启OLED显示
OLED_Display_On();
//清屏
OLED_Clear();
常用
OLED_ShowString(0,11,"2",8);
uint8_t A[]="hellow world !!";
OLED_ShowString(0,0,A,sizeof(A));
uint8_t String[10]={0};
sprintf((char *)String,"aacx:%d ",aacx);//0300
OLED_ShowString(16,8,String,8);
OLED_ShowNum(10,10,10,8,8);//显示数字
OLED_ShowChar(0, 0,'C',16); //显示字符
OLED_ShowCHinese(18,0,0);//显示中文(取字模)
OLED_DrawBMP(0,0,128,8,BMP5); //显示图
超声波测距模块
检测Echo接收端的高低电平法
s定时器中断回调+基本定时器
注意
计时定时器打开关闭
__HAL_TIM_SET_COUNTER(&htim4,0);//等价于htim4.Instance->CNT = 0; 因为在Cube MX 中将TIM4的预分频系数设置为71,故TIM4每隔1us计数器的值加1
__HAL_TIM_ENABLE(&htim4); //开启IM4
__HAL_TIM_DISABLE(&htim4); //关闭TIM4
t=__HAL_TIM_GET_COUNTER(&htim4);//等价于t=(htim4.Instance->CNT);
2个GPIO,一个输出一个输入,都是下拉,及置1为高电平,置0为低电平
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
/* USER CODE BEGIN Callback 0 */
/* USER CODE END Callback 0 */
if (htim->Instance == TIM1) {
HAL_IncTick();
}
/* USER CODE BEGIN Callback 1 */
if(htim->Instance == TIM3)//1s进入一次中断
{
HAL_GPIO_WritePin(TRIG_GPIO_Port,TRIG_Pin,0);
HAL_GPIO_WritePin(TRIG_GPIO_Port,TRIG_Pin,1);
HAL_Delay(1);
HAL_GPIO_WritePin(TRIG_GPIO_Port,TRIG_Pin,0);
while(!(HAL_GPIO_ReadPin(ECHO_GPIO_Port,ECHO_Pin)))
{ //读取ECHO,直至接收端ECHO接收到高电平,
if(++count>100000) break;//防止程序死循环
}
count=0;
__HAL_TIM_SET_COUNTER(&htim4,0);//等价于htim4.Instance->CNT = 0; 因为在Cube MX 中将TIM4的预分频系数设置为71,故TIM4每隔1us计数器的值加1
__HAL_TIM_ENABLE(&htim4); //开启IM4
while(HAL_GPIO_ReadPin(ECHO_GPIO_Port,ECHO_Pin))
{ //读取ECHO,直至接收端ECHO接收到低电平,跳出while
if(++count>100000) break;//防止程序死循环
}
count=0;
__HAL_TIM_DISABLE(&htim4); //关闭TIM4
t=__HAL_TIM_GET_COUNTER(&htim4);//等价于t=(htim4.Instance->CNT);
distances= t*0.017; //声速0.034cm/us,计算出的距离要除以2,distances的单位是cm
/* USER CODE END Callback 1 */
}
}
独立按键
按键一端接GPIO,另一端接GND
上拉输入模式
- 4角按键,同侧不相 连
普通按键消抖(占用资源大)
static uint8_t key_up=1;//按键松开标志
if(key_up==1 && HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0) == 0)//按下
{
HAL_Delay(10);//延时消抖
// while(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0)==0)//未松手
// {
// HAL_Delay(20);
// return 1;
// }
// key_up=1;
//
// }else if(key_up==1 && HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0) == 1) //未按下
// {
// return 0;
// }
key_up=0;//已经按下
if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0)== 0)
{
return 1;//按键1按下
}
}else if(key_up==1 && HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0) == 1) key_up = 1;
return 2;
三行代码
ucKEY_Val = KEY_SCAN();
ucKEY_Down = ucKEY_Val &(ucKEY_Old ^ ucKEY_Val);
ucKEY_Up = ~ucKEY_Val & (ucKEY_Old ^ ucKEY_Val);
ucKEY_Old = ucKEY_Val;
uint8_t unKey_Val = 0;
if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_0) == 0)
unKey_Val = 1;
return unKey_Val;
舵机控制
PWM控制占空比控制角度
PWM频率50HZ(20ms)
例如0.5占空比,0.5x20ms=1ms 45°
舵机需要单独供5V
控制信号的地要和电源共地
72000000/72-1/20000
__HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_1,500);
HAL_Delay(1);//0°
__HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_1,1000);
HAL_Delay(1);//45
__HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_1,1500);
HAL_Delay(1);//90
__HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_1,2000);
HAL_Delay(1);//135
__HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_1,2500);
HAL_Delay(1);//180
占空比就是占了总时的多少
电位器控制舵机
void Servo()
{
static uint8_t Flag=1;
if(Flag==1)
{
Flag=0;
Voltage = (int)(Voltage*1000);
__HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_2,Voltage*0.758);
HAL_Delay(1);
// __HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_2,1000);
// HAL_Delay(1);
// __HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_2,1500);
// HAL_Delay(1);
// __HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_2,2000);
// HAL_Delay(1);
// __HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_2,2500);
// HAL_Delay(1);
Flag=1;
}
}
二维云台追踪
K210
import sensor,image,lcd,time
import ustruct
from fpioa_manager import fm
from machine import UART
# need your connect hardware IO 10/11 to loopback
fm.register(5, fm.fpioa.UART1_TX, force=True)
fm.register(4, fm.fpioa.UART1_RX, force=True)
uart = UART(UART.UART1, 115200, 8, 1, 0, timeout=1000, read_buf_len=4096)
#常用初始化
lcd.init()
lcd.rotation(0)#镜头方向0.1.2.3顺时针
sensor.reset()
sensor.set_vflip(1) #后置模式,所见即所得#复位摄像头
sensor.set_pixformat(sensor.RGB565) #设置像素格式 RGB565
sensor.set_framesize(sensor.QVGA) #设置帧尺寸 QVGA (320x240)
sensor.skip_frames(time = 2000) #跳过不稳定画面
#红色阈值
red_threshold = (87, 21, 27, 93, -5, 92)
#蓝色阈值
blue_threshold = (14, 87, -83, 127, -113, -14)
#寻找最大色块函数定义
def find_max(blobs):
max_size=0
for blob in blobs:
if blob[2]*blob[3] > max_size:
max_blob=blob
max_size = blob[2]*blob[3]
return max_blob
def sending_data(cx,cy,ch):
global uart;
#frame=[0x2C,18,cx%0xff,int(cx/0xff),cy%0xff,int(cy/0xff),0x5B];
#data = bytearray(frame)
data = ustruct.pack("<bbhhhb", #格式为俩个字符俩个短整型(2字节)
0x2C, #帧头1
0x12, #帧头2
int(cx), # up sample by 4 #数据1
int(cy), # up sample by 4 #数据2
int(ch),
0x5B)
uart = UART(UART.UART1, 115200, 8, 1, 0, timeout=1000, read_buf_len=4096)
uart.write(data); #必须要传入一个字节数组
while True:
img=sensor.snapshot()
blobs = img.find_blobs([red_threshold],merge=True)#把拍摄的一张图片里满足的色块纳入集合中
if blobs:
max_blob = find_max(blobs)#调用函数,返回最大色块
img.draw_rectangle((max_blob.x(),max_blob.y(),max_blob.w(),max_blob.h()),color=(255,0,0))#用红色框出最大色块
img.draw_string(max_blob.x(),max_blob.y(), "(x,y) =")
img.draw_string(max_blob.x()+40,max_blob.y(), str(max_blob.cx()))
img.draw_string(max_blob.x()+60,max_blob.y(), str(max_blob.cy()))#在框图左上角显示色块的中心坐标
x_max = 320
x_min = 0
x_1 = 135 #中心区域左边界
x_2 = 175 #中心区域右边界
y_max = 240
y_min = 0
y_1 = 110 #中心区域上边界
y_2 = 130 #中心区域下边界
flag = 0#位置信息标志
if max_blob.cx() >= x_min and max_blob.cx() <= 160 and\
max_blob.cy() >= 0 and max_blob.cy() <= 120 :
flag = 1 #左上区域
if max_blob.cx()>=160 and max_blob.cx() <= x_max and\
max_blob.cy() >=0 and max_blob.cy() <= 120 :
flag = 2 #右上区域
if max_blob.cx()>= x_min and max_blob.cx() <= 160 and \
max_blob.cy() >= 120 and max_blob.cy() <= y_max :
flag = 3 #左下区域
if max_blob.cx()>= 160 and max_blob.cx() <= x_max and \
max_blob.cy() >= 120 and max_blob.cy() <= y_max :
flag = 4 #右下区域
if max_blob.cx()>= x_1 and max_blob.cx() <= x_2 and \
max_blob.cy() >= y_1 and max_blob.cy() <= y_2 :
flag = 5 #中心区域
lcd.display(img)
sending_data(flag)
stm32(固定摄像头)
角度控制 角度=pwm*0.09-45 即pwm=(角度+45)/0.09
PWM控制 //根据坐标量换算PWM,1个坐标,PWM变化6
pwmx= (-cx*6.25+2500);
pwmy= (-cy*8.3+2500);
int pwmx,pwmy;
//X:pwm=-6.25x+500 ,x:0-320
//Y:pwm=-8.3y+500 ,y:0-240
//角度=pwm*0.09-45 即pwm=(角度+45)/0.09
// cx=160,cy=120;
pwmx= (-cx*6.25+2500);
pwmy= (-cy*8.3+2500);
//X
pwmx=pwmx>1700?1700:(pwmx<750?750:pwmx);
pwmy=pwmy>1700?1700:(pwmy<1200?1200:pwmy);
__HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_1,(int)pwmx);
__HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_2,(int)pwmy);
HAL_Delay(1);
stm32移动摄像头
uint8_t x=160,y=120;//中心坐标
int errorx;//偏移中心坐标量
int errory;
int last_errorx,last_errory;//上次误差
float px=-0.5,dx=-0.005,py=-0.8,dy=-0.8;//pd
errorx= cx-x;//计算误差
errory= cy-y;
pwmx= px*errorx+dx*(last_errorx-errorx)+1500;//pwm1500是90度
pwmy= py*errory+dy*(last_errory-errory)+1500;//pwm1500是90度
pwmx=pwmx>1700?1700:(pwmx<750?750:pwmx);
pwmy=pwmy>2300?2300:(pwmy<700?700:pwmy);
__HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_1,(int)pwmx);
__HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_2,(int)pwmy);
HAL_Delay(500);
last_errorx = errorx;
last_errory = errory;
光电编码器测速
编码器读取脉冲计数
HAL_TIM_Encoder_Start(&htim3,TIM_CHANNEL_1);//编码器
HAL_TIM_Encoder_Start(&htim3,TIM_CHANNEL_2);
HAL_TIM_Encoder_Start(&htim4,TIM_CHANNEL_1);
HAL_TIM_Encoder_Start(&htim4,TIM_CHANNEL_2);
int Encoder_Left,Encoder_Right;
// 1.采集编码器数据&MPU6050角度信息
// 电机是相对安装,刚好相差180度,为了编码器输出极性一致,就需要对其中一个取反
Encoder_Left = Read_Encoder(3);//读取编码器测量的电机转速
Encoder_Right = Read_Encoder(4);
/**************************************************************************
函数功能:单位时间读取编码器计数
入口参数:定时器
返回 值:速度值
**************************************************************************/
uint32_t Read_Encoder(uint8_t TIMX) //编码器控制周期10ms
{
uint32_t Encoder_TIM;
switch(TIMX)
{
case 4: //单周期位移作为速度值
Encoder_TIM = (short)__HAL_TIM_GET_COUNTER(&htim4);//采集编码器的值并保存
__HAL_TIM_SET_COUNTER(&htim4,0); //将定时器的计数值清零
break;
case 3: Encoder_TIM = (short)__HAL_TIM_GET_COUNTER(&htim3);
__HAL_TIM_SET_COUNTER(&htim3,0);
break;
default: Encoder_TIM = 0;
}
return Encoder_TIM;
}
利用单位时间编码器脉冲个数来控制小车行驶距离
例如,做好的智能小车模型,在10KHZPWM频率下,PWM-2000,脉冲个数4500,到达十字路口
if(Encoder_flag==1)
{
Encoder_Integral+=Encoder_Left;//对编码器数值积分记录,注意每次记录逻辑清0,利用状态机
}
红外寻迹模块
红外识别到黑线灯灭,反之亮,读取IO口为浮空输入,低电平为0
只能针对黑线
#define Read1 HAL_GPIO_ReadPin(IN1_GPIO_Port,IN1_Pin)
#define Read2 HAL_GPIO_ReadPin(IN2_GPIO_Port,IN2_Pin)
#define Read3 HAL_GPIO_ReadPin(IN3_GPIO_Port,IN3_Pin)
#define Read4 HAL_GPIO_ReadPin(IN4_GPIO_Port,IN4_Pin)
#define Read5 HAL_GPIO_ReadPin(IN5_GPIO_Port,IN5_Pin)
#define u8 unsigned char
#define u16 unsigned short
#define u32 unsigned int
void Control()
{ //识别到黑线LED熄灭,即IO口读取到低电平
if((Read1==1&&Read2==1) &&Read3==0 &&(Read4==1&&Read5==1))//前进
{
AIN1 = 1,AIN2=0;
BIN1 = 1,BIN2=0;
}
else if((Read1==1&&Read2==1) && (Read3==1||Read3==0) &&(Read4==0||Read5==0))//车左偏
{
AIN1 = 1,AIN2=0;
BIN1 = 0,BIN2=1;
}
else if((Read1==0||Read2==0) &&(Read3==1||Read3==0) &&(Read4==1&&Read5==1))//右偏
{
AIN1 = 0,AIN2=1;
BIN1 = 1,BIN2=0;
}
else if((Read1==0||Read2==0) &&(Read3==1||Read3==0) &&(Read4==0||Read5==0))//环岛入口右转
{
AIN1 = 1,AIN2=0;
BIN1 = 0,BIN2=1;
}
else if((Read1==1&&Read2==1) &&(Read3==1||Read3==0) &&(Read4==0||Read5==0))//环岛出口右转
{
AIN1 = 1,AIN2=0;
BIN1 = 0,BIN2=1;
}
else if((Read1==0&&Read2==0) &&(Read3==1||Read3==0) &&(Read4==0&&Read5==0))//T型入口右转
{
AIN1 = 1,AIN2=0;
BIN1 = 0,BIN2=1;
}
}
灰度传感器
数字灰度传感器
低电平有效,即亮灯的时候是单片机IO口识别到低电平
可调电阻可以调节灵敏度
STM32
//五路
void Go();
void Right();
void Left();
void Stop();
#define u8 uint8_t
#define u16 uint16_t
u8 X;//控制寻迹
u16 Speed=3000;控制速度
if((read1==0&&read2==0) &&(read3==1||read3==0) &&(read4==0&&read5==0))//前进
{
X=0;
}
else if((read1==0&&read2==0) &&(read3==1||read3==0) &&(read4==1||read5==1))//小车左偏了
{
X=2;
}
else if((read1==1||read2==1) &&(read3==1||read3==0) &&(read4==0&&read5==0))//小车右偏了
{
X=1;
}
void Tracking()
{
switch(X)
{
case 0:
Go();
Encoder_flag=1;
break;
case 1:
Left();
Encoder_flag=0;
break;
case 2:
Right();
Encoder_flag=0;
break;
}
}
void Go()
{
HAL_GPIO_WritePin(AIN1_GPIO_Port,AIN1_Pin,1);
HAL_GPIO_WritePin(AIN2_GPIO_Port,AIN2_Pin,0);
HAL_GPIO_WritePin(BIN1_GPIO_Port,BIN1_Pin,1);
HAL_GPIO_WritePin(BIN2_GPIO_Port,BIN2_Pin,0);
__HAL_TIM_SET_COMPARE(&htim4,TIM_CHANNEL_1,Speed);
__HAL_TIM_SET_COMPARE(&htim4,TIM_CHANNEL_2,Speed);
}
void Left()
{
HAL_GPIO_WritePin(AIN1_GPIO_Port,AIN1_Pin,0);
HAL_GPIO_WritePin(AIN2_GPIO_Port,AIN2_Pin,1);
HAL_GPIO_WritePin(BIN1_GPIO_Port,BIN1_Pin,1);
HAL_GPIO_WritePin(BIN2_GPIO_Port,BIN2_Pin,0);
__HAL_TIM_SET_COMPARE(&htim4,TIM_CHANNEL_1,Speed);
__HAL_TIM_SET_COMPARE(&htim4,TIM_CHANNEL_2,Speed);
}
void Right()
{
HAL_GPIO_WritePin(AIN1_GPIO_Port,AIN1_Pin,1);
HAL_GPIO_WritePin(AIN2_GPIO_Port,AIN2_Pin,0);
HAL_GPIO_WritePin(BIN1_GPIO_Port,BIN1_Pin,0);
HAL_GPIO_WritePin(BIN2_GPIO_Port,BIN2_Pin,1);
__HAL_TIM_SET_COMPARE(&htim4,TIM_CHANNEL_1,Speed);
__HAL_TIM_SET_COMPARE(&htim4,TIM_CHANNEL_2,Speed);
}
void Stop()
{
HAL_GPIO_WritePin(AIN1_GPIO_Port,AIN1_Pin,0);
HAL_GPIO_WritePin(AIN2_GPIO_Port,AIN2_Pin,0);
HAL_GPIO_WritePin(BIN1_GPIO_Port,BIN1_Pin,0);
HAL_GPIO_WritePin(BIN2_GPIO_Port,BIN2_Pin,0);
__HAL_TIM_SET_COMPARE(&htim4,TIM_CHANNEL_1,0);
__HAL_TIM_SET_COMPARE(&htim4,TIM_CHANNEL_2,0);
HAL_Delay(500);
}
void Back()
{
HAL_GPIO_WritePin(AIN1_GPIO_Port,AIN1_Pin,0);
HAL_GPIO_WritePin(AIN2_GPIO_Port,AIN2_Pin,1);
HAL_GPIO_WritePin(BIN1_GPIO_Port,BIN1_Pin,0);
HAL_GPIO_WritePin(BIN2_GPIO_Port,BIN2_Pin,1);
__HAL_TIM_SET_COMPARE(&htim4,TIM_CHANNEL_1,Speed);
__HAL_TIM_SET_COMPARE(&htim4,TIM_CHANNEL_2,Speed);
}
模拟灰度传感器
多路数模转换ADC
CubeMX配置
历程
#include "stdio.h"
#include "string.h"
uint16_t ADCRes[4]; //变量易变,编译器不能随便优化
//-----printf重定向-----
int fputc(int ch,FILE *f)
{
HAL_UART_Transmit(&huart1,(uint8_t *)&ch,1,0xFFFF);
while(__HAL_UART_GET_FLAG(&huart1,UART_FLAG_TC)!=SET);//等待发送完成
return ch;
}
HAL_ADCEx_Calibration_Start(&hadc1);
HAL_ADC_Start_DMA(&hadc1,(uint32_t*)ADCRes,10);//4个通道8个,3个就为6,长度不对数据就会出错
while (1)
{
/* USER CODE END WHILE */
// char str[64];
// sprintf(str,"%f,%f,%f,%f,%f\r\n",(ADCRes[0]*3.3)/4095,(ADCRes[1]*3.3)/4095,(ADCRes[2]*3.3)/4095,(ADCRes[3]*3.3)/4095,(ADCRes[4]*3.3)/4095); //一次触发无限次采样
// HAL_UART_Transmit(&huart1,(uint8_t*)str,strlen(str),HAL_MAX_DELAY);
uint8_t i;
for(i=0;i<100;i++)
{
if(i==100)
{
printf("%f,%f,%f,%f,%f\r\n",(ADCRes[0]*3.3)/4095,(ADCRes[1]*3.3)/4095,(ADCRes[2]*3.3)/4095,(ADCRes[3]*3.3)/4095,(ADCRes[4]*3.3)/4095); //一次触发无限次采样
i=0;
}
}
/* USER CODE BEGIN 3 */
}
评论