• PWM控制舵机


    任务要求

    使用PWM控制舵机进行舵机在舵机角度范围内任意角度旋转。
    注意事项:尽量不要用外力阻碍舵机旋转,避免对单片机造成伤害。
    验收要求
    初始位置0°,按一下按键(可自定任意一个按键)旋转30°,如果到头就转向,变成按一下按键反向转30°
    反复按一个按键,角度从0变到最大角度再回到0

    思路

    在这里插入图片描述
    需要用到30°
    所以利用原有的
    0° 1500 0.5ms
    45° 3000 1ms
    ……
    计算出比例
    就可以估算求得
    30.06 2502 0.834 1002

    整个周期是20ms,溢出值是60000
    0 0.5ms 1500
    180 2.5ms 7500
    溢出时间=(arr+1)(psc+1)/Tclk
    20MS = (59999+1)*(23+1)/72000000

    完成的代码

    int main (void){
    //定义变量必须放在最前面
    	u16 t = 1500;
    	u8 dir = 1;
    	
    	delay_ms(500); 
    	RCC_Configuration();  
    	RELAY_Init();
    	I2C_Configuration();
    	TOUCH_KEY_Init();//初始化触摸按键
    	TIM3_PWM_Init(59999,23); 
    	//使初始情况是0°
    TIM_SetCompare3(TIM3,1500);
    	while(1){
    	delay_ms(10);	
    	//正方向,每次按下按键走30°
    	if(dir){
    		for(t=1500;t<7500;){
    	
    		if(!GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_B)){ 
    if(!GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_B)){
    
    	t=t+1002;//需要先++再执行所以把代码写在这里
    			TIM_SetCompare3(TIM3,t);    
    
    while(!GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_B)); 
       }
    }
    		}	
    		}	
    		if(t==7500)dir=0;
    	//负方向,每次按下按键走30°
    			else{
    				for(t=7500;t>1500;){
    					
    						if(!GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_B)){ 
    if(!GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_B)){ 
    	t=t-1002;
    			TIM_SetCompare3(TIM3,t);    
    
    while(!GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_B)); 
       }
    }
    	}	
    				
    }			
    if(t==1500)dir=1;//与上一条对应的if语句需要写在if(dir)的外面,不然循环无法跳出
    }
    }
    
    • 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

    因为需要每次按键按下都走30°所以按键应该是有锁存的情况,与之前机械按键有锁存的原理一样。但是触摸按键不需要延时消抖。

  • 相关阅读:
    圣杯布局和双飞翼布局
    第五节:方法的使用【java】
    2.1 向量与线性方程组
    MobPush Android 快速集成
    Linux升级OpenSSH 常见问题
    01-mysql5.7安装部署-yum安装
    HR常用的人才测评工具,测什么,怎么测?
    Docker Compose部署Mysql8
    java计算机毕业设计高校实习实训管理系统源码+mysql数据库+系统+lw文档+部署
    el-table自适应列宽实现
  • 原文地址:https://blog.csdn.net/Ll_R_lL/article/details/125543238