基于mini stm32 PS2遥控控制舵机,LCD屏显示

2024-03-07 11:08

本文主要是介绍基于mini stm32 PS2遥控控制舵机,LCD屏显示,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

引言

          这是为了研究微型四旋翼无人机做的一个小测试,测试摇杆和舵机的性能,为后续控制空心杯电机做准备

实验器材

miniSTM32板,servo 9g 舵机,PS2摇杆,LCD显示屏

实物接线

ps2        stm32                        舵机                 stm32

GND      GND                         橙色信号线        PA8

+5V         3.3V                    舵机需要4.6V-6V之间电源供电,需要额外供电

VRX         PA0

VRY          PA1

SW           PA3

    舵机

   舵机需要一个频率为50hz的pwm波来控制,占空比与角度关系如下图所示

程序

主函数部分:

int main(void){ u16 pwmval;u16 adcx,adcy,adcz;int i;float temp,temp1,temp2;delay_init();             //延时函数初始化      uart_init(9600);         //串口初始化为9600LED_Init();                //  LED和PWM初始化的先后顺序非常重要TIM1_PWM_Init(7199,199);LCD_Init();          Adc_Init();    adcx=Get_Adc_Average(ADC_Channel_1,10);adcy=Get_Adc_Average(ADC_Channel_2,10);adcz=Get_Adc_Average(ADC_Channel_3,10);pwmval=(int)adcx*(7200/4096);//这里的参数不能修改,不然输出数值不变pwmval=pwmval/6;      //可以在这里修改,根据舵机的占空比来定数值pwmval+=6300;if(pwmval>=6300&&pwmval<7020){TIM_SetCompare1(TIM1,pwmval); }  elsefor(i=7020;i>6300;i--){TIM_SetCompare1(TIM1,i);LED1=!LED1;delay_ms(10);}

LCD显示部分代码

LCD_ShowxNum(156,130,adcx,4,16,0);//显示ADC的值LCD_ShowxNum(156,170,adcy,4,16,0);LCD_ShowxNum(156,210,adcz,4,16,0);temp=(float)adcx*(3.3/4096);adcx=temp;temp1=(float)adcy*(3.3/4096);adcy=temp1;temp2=(float)adcz*(3.3/4096);adcz=temp2;LCD_ShowxNum(156,150,adcx,1,16,0);//显示电压值整数部分LCD_ShowxNum(156,190,adcy,1,16,0);LCD_ShowxNum(156,230,adcz,1,16,0);temp-=adcx;temp1-=adcy;temp2-=adcz;temp*=1000;temp1*=1000;temp2*=1000;LCD_ShowxNum(172,150,temp,3,16,0X80);//读取的电压值小数部分LCD_ShowxNum(172,190,temp1,3,16,0X80);LCD_ShowxNum(172,230,temp2,3,16,0X80);

adc部分代码

//PA1 作为模拟通道输入引脚                         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;		//模拟输入引脚GPIO_Init(GPIOA, &GPIO_InitStructure);	//PA2 作为模拟通道输入引脚 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;		//模拟输入引脚GPIO_Init(GPIOA, &GPIO_InitStructure);	//PA3 作为模拟通道输入引脚 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;		//模拟输入引脚GPIO_Init(GPIOA, &GPIO_InitStructure);	

u16 Get_Adc(u8 ch)   
{//设置指定ADC的规则组通道,一个序列,采样时间ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5 );	//ADC1,ADC通道,采样时间为239.5周期	  			    ADC_RegularChannelConfig(ADC1, ch, 2, ADC_SampleTime_239Cycles5 );ADC_RegularChannelConfig(ADC1, ch, 3, ADC_SampleTime_239Cycles5 );ADC_SoftwareStartConvCmd(ADC1, ENABLE);		//使能指定的ADC1的软件转换启动功能	while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//等待转换结束return ADC_GetConversionValue(ADC1);	//返回最近一次ADC1规则组的转换结果
}u16 Get_Adc_Average(u8 ch,u8 times)
{u32 temp_val=0;u8 t;for(t=0;t<times;t++){temp_val+=Get_Adc(ch);delay_ms(5);}return temp_val/times;
} 	 

实物效果

 总结:

工程文件基于stm32官方提供的ADC文件,在此基础上添加了pwm.c等文件,注意除了在hardware中添加pwm.c,还要在FWlib中添加stm32f10x.time.c文件,不然编译会报错!!!

此外,还要注意GPIO口可能有多个功能,作为PWM通道或者LED0的输出端口,这些看似不相干的模式,其实互相联系,当要输出pwm波时,就必须先初始化GPIO,否则就输出不了pwm!

ps2摇杆控制舵机,基于stm32mini板

这篇关于基于mini stm32 PS2遥控控制舵机,LCD屏显示的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/783297

相关文章

Spring Security 基于表达式的权限控制

前言 spring security 3.0已经可以使用spring el表达式来控制授权,允许在表达式中使用复杂的布尔逻辑来控制访问的权限。 常见的表达式 Spring Security可用表达式对象的基类是SecurityExpressionRoot。 表达式描述hasRole([role])用户拥有制定的角色时返回true (Spring security默认会带有ROLE_前缀),去

第10章 中断和动态时钟显示

第10章 中断和动态时钟显示 从本章开始,按照书籍的划分,第10章开始就进入保护模式(Protected Mode)部分了,感觉从这里开始难度突然就增加了。 书中介绍了为什么有中断(Interrupt)的设计,中断的几种方式:外部硬件中断、内部中断和软中断。通过中断做了一个会走的时钟和屏幕上输入字符的程序。 我自己理解中断的一些作用: 为了更好的利用处理器的性能。协同快速和慢速设备一起工作

安卓链接正常显示,ios#符被转义%23导致链接访问404

原因分析: url中含有特殊字符 中文未编码 都有可能导致URL转换失败,所以需要对url编码处理  如下: guard let allowUrl = webUrl.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) else {return} 后面发现当url中有#号时,会被误伤转义为%23,导致链接无法访问

C#实战|大乐透选号器[6]:实现实时显示已选择的红蓝球数量

哈喽,你好啊,我是雷工。 关于大乐透选号器在前面已经记录了5篇笔记,这是第6篇; 接下来实现实时显示当前选中红球数量,蓝球数量; 以下为练习笔记。 01 效果演示 当选择和取消选择红球或蓝球时,在对应的位置显示实时已选择的红球、蓝球的数量; 02 标签名称 分别设置Label标签名称为:lblRedCount、lblBlueCount

【STM32】SPI通信-软件与硬件读写SPI

SPI通信-软件与硬件读写SPI 软件SPI一、SPI通信协议1、SPI通信2、硬件电路3、移位示意图4、SPI时序基本单元(1)开始通信和结束通信(2)模式0---用的最多(3)模式1(4)模式2(5)模式3 5、SPI时序(1)写使能(2)指定地址写(3)指定地址读 二、W25Q64模块介绍1、W25Q64简介2、硬件电路3、W25Q64框图4、Flash操作注意事项软件SPI读写W2

STM32(十一):ADC数模转换器实验

AD单通道: 1.RCC开启GPIO和ADC时钟。配置ADCCLK分频器。 2.配置GPIO,把GPIO配置成模拟输入的模式。 3.配置多路开关,把左面通道接入到右面规则组列表里。 4.配置ADC转换器, 包括AD转换器和AD数据寄存器。单次转换,连续转换;扫描、非扫描;有几个通道,触发源是什么,数据对齐是左对齐还是右对齐。 5.ADC_CMD 开启ADC。 void RCC_AD

STM32内部闪存FLASH(内部ROM)、IAP

1 FLASH简介  1 利用程序存储器的剩余空间来保存掉电不丢失的用户数据 2 通过在程序中编程(IAP)实现程序的自我更新 (OTA) 3在线编程(ICP把整个程序都更新掉) 1 系统的Bootloader写死了,只能用串口下载到指定的位置,启动方式也不方便需要配置BOOT引脚触发启动  4 IAP(自己写的Bootloader,实现程序升级) 1 比如蓝牙转串口,

FreeRTOS-基本介绍和移植STM32

FreeRTOS-基本介绍和STM32移植 一、裸机开发和操作系统开发介绍二、任务调度和任务状态介绍2.1 任务调度2.1.1 抢占式调度2.1.2 时间片调度 2.2 任务状态 三、FreeRTOS源码和移植STM323.1 FreeRTOS源码3.2 FreeRTOS移植STM323.2.1 代码移植3.2.2 时钟中断配置 一、裸机开发和操作系统开发介绍 裸机:前后台系

寻迹模块TCRT5000的应用原理和功能实现(基于STM32)

目录 概述 1 认识TCRT5000 1.1 模块介绍 1.2 电气特性 2 系统应用 2.1 系统架构 2.2 STM32Cube创建工程 3 功能实现 3.1 代码实现 3.2 源代码文件 4 功能测试 4.1 检测黑线状态 4.2 未检测黑线状态 概述 本文主要介绍TCRT5000模块的使用原理,包括该模块的硬件实现方式,电路实现原理,还使用STM32类

控制反转 的种类

之前对控制反转的定义和解释都不是很清晰。最近翻书发现在《Pro Spring 5》(免费电子版在文章最后)有一段非常不错的解释。记录一下,有道翻译贴出来方便查看。如有请直接跳过中文,看后面的原文。 控制反转的类型 控制反转的类型您可能想知道为什么有两种类型的IoC,以及为什么这些类型被进一步划分为不同的实现。这个问题似乎没有明确的答案;当然,不同的类型提供了一定程度的灵活性,但