• 模拟摇杆控制舵机


    任务:

    电位器和舵机组合应用,如果是180°舵机,电位器有效范围也是180°,如果是90°舵机,电位器有效范围为90°,电位器和舵机角度位置同步,电位器有效起点自定,终点为(起点+90°/180°)
     

    思路

    洋桃开发板上电位器是左边的全向摇杆,使用摇杆的x轴或者y轴控制舵机角度
    例如摇杆在最左侧对应舵机0°,拉到最右侧舵机转到180°
    舵机的角度在摇杆的起点和终点上均匀分布
    摇杆本质是可调电阻,电阻分压后可以使用单片机的ADC获取位置状态

    完成代码

    int main (void){//主程序
    
    	 
    	delay_ms(500); //上电时等待其他器件就绪
    	RCC_Configuration(); //系统时钟初始化 
    	TOUCH_KEY_Init();//触摸按键初始化
    	RELAY_Init();//继电器初始化
    
    
    	TIM3_PWM_Init(59999,23); 
    	ADC_Configuration(); //ADC初始化设置(模拟摇杆的ADC初始化)
    	JoyStick_Init(); //模拟摇杆的按键初始化
    
    	I2C_Configuration();//I2C初始化
    	OLED0561_Init(); //OLED初始化
    	OLED_DISPLAY_8x16_BUFFER(0,"   YoungTalk "); //显示字符串
    	OLED_DISPLAY_8x16_BUFFER(2,"   ADC TEST  "); //显示字符串
    	OLED_DISPLAY_8x16_BUFFER(4," ADC_IN6:    "); //显示字符串
    	OLED_DISPLAY_8x16_BUFFER(6," ADC_IN7:    "); //显示字符串
    
    
    	while(1){
    		//将光敏电阻的ADC数据显示在OLED上
    		OLED_DISPLAY_8x16(4,10*8,ADC_DMA_IN[0]/1000+0x30);//
    		OLED_DISPLAY_8x16(4,11*8,ADC_DMA_IN[0]%1000/100+0x30);//
    		OLED_DISPLAY_8x16(4,12*8,ADC_DMA_IN[0]%100/10+0x30);//
    		OLED_DISPLAY_8x16(4,13*8,ADC_DMA_IN[0]%10+0x30);//
    
    		OLED_DISPLAY_8x16(6,10*8,ADC_DMA_IN[1]/1000+0x30);//
    		OLED_DISPLAY_8x16(6,11*8,ADC_DMA_IN[1]%1000/100+0x30);//
    		OLED_DISPLAY_8x16(6,12*8,ADC_DMA_IN[1]%100/10+0x30);//
    		OLED_DISPLAY_8x16(6,13*8,ADC_DMA_IN[1]%10+0x30);//
    
    
     //方法一:分区间控制(简单但是麻烦)
    //		if(ADC_DMA_IN[0]<100)
    //		 TIM_SetCompare3(TIM3,1500); 
    //
    //		 if(ADC_DMA_IN[0]>=100&&ADC_DMA_IN[0]<1700)
    //		 TIM_SetCompare3(TIM3,ADC_DMA_IN[0]+1500);
    //		  if(ADC_DMA_IN[0]>=1700&&ADC_DMA_IN[0]<2000)
    //		 TIM_SetCompare3(TIM3,ADC_DMA_IN[0]+2300);
    //
    //        if( ADC_DMA_IN[0]>=2000&&ADC_DMA_IN[0]<3500)
    //		  TIM_SetCompare3(TIM3,ADC_DMA_IN[0]+2500);
    //		  if( ADC_DMA_IN[0]>=3500&&ADC_DMA_IN[0]<4000)
    //			 TIM_SetCompare3(TIM3,ADC_DMA_IN[0]+3500);
    //			
    //			 if( ADC_DMA_IN[0]>4000)
    //            TIM_SetCompare3(TIM3,7500);
    //		   delay_ms(10);
    
     //方法二:写公式转换(难但是方便)
    
    			TIM_SetCompare3(TIM3,ADC_DMA_IN[0]*(3.3/4096)*1820+1500);
    	
    
    		if(GPIO_ReadInputDataBit(JoyStickPORT,JoyStick_KEY)==0){
    	
    			OLED_DISPLAY_8x16(0,0,'Y');//
    		}else{
    			OLED_DISPLAY_8x16(0,0,' ');//
    		}
    		delay_ms(200); //延时
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
  • 相关阅读:
    【JavaEE】MyBaits(注解方式实现映射)
    极限五分钟,在宝塔中用 Docker 部署升讯威在线客服系统
    Spirng,SpringBoot实现多文件上传(MultipartFile)
    【Linux】Windows安装VirtualBox虚拟机以及CentOS操作系统
    【从零开始学习 UVM】2.1、UVM 基础功能 —— Base Class
    [附源码]计算机毕业设计求职招聘网站Springboot程序
    vue预览PDF文件的几种方法
    每章一篇博客带你拿下吉林大学JAVAEE期末(四:JDBC)
    【机器学习笔记】【决策树】【回归树】
    微服务Spring Boot 整合Redis 阻塞队列实现异步秒杀下单
  • 原文地址:https://blog.csdn.net/Ll_R_lL/article/details/125604153