【STM32】外设模块合集篇
【STM32】外设模块合集篇
本文最后更新于337 天前,其中的信息可能已经过时,如有错误请发送邮件到273925452@qq.com
Avatar
小鹿整理的是自己以前用过的外设模块,希望对你有帮助😀

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); //显示图 

超声波测距模块

链接:HC-SR04超声波模块的使用

检测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 */
    }
}

独立按键

STM32 ——按键控制LED灯 程序详解

三行代码按键消抖 独立按键 矩阵按键 长按 短按 双击

按键一端接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 */
  }
💡商业转载请联系作者获得授权,非商业转载请注明出处。
协议(License):署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)。
使用这些免费资源的时候应遵守版权意识,切勿非法利用,售卖,尊重原创内容知识产权。未经允许严禁转载。

评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇