2.基于STM32C8T6的四旋翼无人机的飞控制作----理论准备2,STM32的使用

3.STM32单片机的使用

    ST(意法半导体)公司出的STM32系列单片机,目前在工业智能家居等行业应用比较广泛,也是大学生相对比较容易上手的,但是也是有很多很多的注意点,需要很长的时间去研究各种的应用。

   所需软件:STM32使用过程中,使用多种软件,编译器常用的是MDK 5(KEIL4也行),编译器自带下载功能,串口助手可以任意选择一家的,下载器使用ST-link或jlink,最简单的下载模式是SW模式,只需要四根线,GND,VCC,SWDIO,SWCLK。程序下载有两种方式,一种是用MDK5下载,可以在线调试,另一种是使用串口下载,不能在线调试,但是需要通过改变boot0,boot1电平来选择下载模式。

  STM32的功能强大,在无人机上用到的功能只是它的一部分

(1)PWM输出

      电机调速经常使用PWM来实现,通过改变PWM波形的占空比可以改变电机大的转速,在无人机上使用PWM也是同样的道理,但是不同的是,如果需要自己制作电调则需要学习更多关于无刷电机的知识。

      STM32内部有很多时钟,名称一般简称为TIM,分类有普通时钟,高级时钟等,在四旋翼无人机上,我们需要STM32能够产生四路占空比可调的pwm我使用的是TIM2。

      只知道如何输出PWM还不能让无刷电机动起来,因为一般厂家的电调都会做上启动机制,以免误启动造成螺旋桨伤人事故。具体的型号可能有差别,我也忘记我们的具体步骤了,大概的意思是上来之后先给电调一个最高的占空比,听到滴一声后再给最低的占空比,滴滴两声后启动就完成了,然后若在输给pwm,无刷电机就会动起来了。具体步骤不是很准确,但是可以为初学者提供一个借鉴,不要忽略有这回事。

(2)I2C

     I2C是单片机等嵌入式设备中常用的通信方式,许多的传感器数据都是通过I2c的形式输出到单片机,因此需要掌握I2C相关的基础知识,在无人机中,陀螺仪传感器(如MPU6050)就是通过I2C输出数据,信号线只需要一个SDA与SCL,但是注意陀螺仪要与stm32共地。I2C的原理可以不是很懂,也不用记得很清楚,只需要会移植相关的程序就行。

(3)PWM输入捕获

    当时我大一做的时候就是卡在了这个环节,但是使用的还是K60单片机,个人认为是最难的一个。遥控器发过来的信号表现形式是pwm波形,占空比的大小代表了摇杆各个活动方向的位置,或者说油门大小、左转角度等等

   使用的还是单片机上的TIM,使用时钟捕获PWM,使用定时器进行计时,上升沿开始计时,下降沿结束计时就能得到占空比。到最后也不需算出真正的百分之几,只需要这4个变量能够根据摇杆的角度变化而变化。范围根据需要进行放缩

(4)SPI(12864显示屏)

   进行设备调试时需要看某些数据的变化,使用KEIL可以实现,但是不能抱着电脑跟着跑,有对应的调试设备更好,将12864显示屏移植到程序当中是个不错的选择

至此无人机上必须的几个单片机功能已介绍完,其他的功能可以视情况添加,但是这四个模块是必须要有的

  • 10
    点赞
  • 57
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,以下是基于STM32C8T6和MQ-2烟雾传感器的代码: ```c #include "stm32f10x.h" #include "stdio.h" #define USARTz USART1 #define BAUD_RATE 9600 void USART_Config(void) { USART_InitTypeDef USART_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_USART1, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, &GPIO_InitStructure); USART_InitStructure.USART_BaudRate = BAUD_RATE; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx; USART_Init(USARTz, &USART_InitStructure); USART_Cmd(USARTz, ENABLE); } void USART_PutChar(char c) { while (USART_GetFlagStatus(USARTz, USART_FLAG_TXE) == RESET); USART_SendData(USARTz, c); } void USART_PutString(char *s) { while (*s) { USART_PutChar(*s++); } } void ADC_Config(void) { ADC_InitTypeDef ADC_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_ADC1, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; GPIO_Init(GPIOA, &GPIO_InitStructure); ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; ADC_InitStructure.ADC_ScanConvMode = DISABLE; ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; ADC_InitStructure.ADC_NbrOfChannel = 1; ADC_Init(ADC1, &ADC_InitStructure); ADC_Cmd(ADC1, ENABLE); ADC_ResetCalibration(ADC1); while(ADC_GetResetCalibrationStatus(ADC1)); ADC_StartCalibration(ADC1); while(ADC_GetCalibrationStatus(ADC1)); } int main(void) { ADC_Config(); USART_Config(); while (1) { ADC_SoftwareStartConvCmd(ADC1, ENABLE); while (!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC)); uint16_t value = ADC_GetConversionValue(ADC1); char buffer[100]; sprintf(buffer, "Smoke value: %d\n", value); USART_PutString(buffer); delay_ms(1000); } } void delay_ms(uint32_t ms) { ms *= 1000; while (ms--) { __NOP(); } } ``` 请注意,在这个示例代码中,我使用了USART1和PA9 / PA10引脚作为串口通信的接口。您需要根据您的实际硬件配置对代码进行一些调整。 此外,这个示例代码仅仅是一个简单的演示程序,只有烟雾传感器的输出值会被读取并通过串口发送。如果您需要更复杂的功能,例如根据烟雾传感器的输出值控制其他设备或执行其他操作,您需要进行更多的编程工作。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值