• (个人杂记)第十四章 PWM输出实验


    知识回顾

    重映射:将内置外设的输入输出端口改变到其他端口,也就不是上一次使用的端口复用

    在本章中,我们将使用TIM3的通道2,把通道2重映射到PB5,产生PWM来控制DSO的亮度。
    (STM32F1开发指南)P211

    查表如下:
    在这里插入图片描述
    使用端口重映射的原因:

    我们要利用TIM3的CH2输出PWM来控制DSO的亮度,但是TIM3_ CH2默认是接在PA7上面的,
    而我们的DS0接在PB5上面,如果普通MCU,可能就只能用飞线把PA7飞到PB5上来实现了,
    不过,我们用的是STM32,它比较高级,可以通过重映射功能,把TIM3_ CH2映射到PB5上
    (STM32F1开发指南)P213

    LED灯的最大值可以设置到899
    我们可以通过定时器重映射到LED的端口,然后通过定时器产生的脉冲宽度PWM来控制LED的亮度


    自主设计案例

    1. 串口通信。0xC5是通信头+命令一个字节+参数长度+参数n
    2. 接收到指令后返回指令。Ack_Rec();
    3. 0xAA:LED1灯亮n次,然后打印:“已经亮了N次了”
    4. 0xBB:LED0灯的亮度变化,n(亮度值的指定),如果大于原先的亮度值,端口打印:“变亮”,反之,端口打印:“变暗”,没变化就:“没变化”
    5. 0xCC:熄灭两个LED灯

    灯闪范围:范围是0x00 ~ 0x99 = 0~153,超过次数就错误
    TIM3定时器复用了LED0的IO接口,所以不能正常LED操作

    if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中断(接收到的数据必须是0x0d 0x0a结尾)
    		Res =USART_ReceiveData(USART1);	//读取接收到的数据
    		
    
    		if((USART_RX_STA&0x8000)==0)
    		{	
    
    			if(USART_RX_STA>2)//5
    			{
    				USART_RX_BUF[USART_RX_STA&0X3FFF]=Res;			
    				USART_RX_STA++;//3固定的
    				if(USART_RX_STA>6){
    					USART_RX_STA=0;
    				}
    				
    				if(USART_RX_STA==Para_len+5)//1+3(参数位+固定3个字节) 判断是否接收完
    				{
    					USART_RX_STA|=0x8000;	
    				}
    			}
    			//命令字节接收
    			else if(USART_RX_STA==1)
    			{
    				USART_RX_BUF[USART_RX_STA&0X3FFF]=Res; 
    				USART_RX_STA++;
    			}
    			else if(USART_RX_STA==2)
    			{
     				Para_len = Res&0xffff;
    				USART_RX_BUF[USART_RX_STA&0X3FFF]=Res;
    				USART_RX_STA++;
    			}
    			
    			//通讯头: 占1字节,表示通讯开始,通讯头固定为C5
    			else if(Res==0xc5&&USART_RX_STA==0)
    			{
    				USART_RX_BUF[USART_RX_STA&0X3FFF]=Res;
    				USART_RX_STA++;
    			} 				 
    		}
    
    • 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
    u8 ACKR[2];
    u8 i;
    static 	u16 led0pwmval=0;
    void Cmd_ack(void)
    {
    	ACKR[0]=0xC5;
    	ACKR[1]=USART_RX_BUF[1];
    	for(i=0;i<2;i++)
    	{
    		USART_SendData(USART1,ACKR[i]);
    		while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束
    	}
    }
    
    void Flash_N(u8 n)//范围是0x0~99=0~153
    {
    	for(i=0;i<n;i++)
    	{
    		delay_ms(30);
    		LED1=!LED1;
    		delay_ms(30);
    	}
    	if(i==n)
    	{
    		printf("LED灯亮了%d次",n);
    	}
    }
    
    void Change_N(u16 n)
    {
    		delay_ms(10);	
    		if(led0pwmval<n)
    		{
    			printf("变亮!\r\n");
    			delay_ms(10);
    			led0pwmval=n;
    			TIM_SetCompare2(TIM3,n);//这个是用来控制占比的  可以通过脉冲宽度调制pwm来控制LED灯的亮度
    		}
    		else if(led0pwmval>n)
    		{
    			printf("变暗!\r\n");
    			delay_ms(10);
    			led0pwmval=n;
    			TIM_SetCompare2(TIM3,n);//这个是用来控制占比的  可以通过脉冲宽度调制pwm来控制LED灯的亮度
    		}
    		else if(led0pwmval==n)
    		{
    			printf("不变!\r\n");
    		}
    		
    }
    
    void Close_Led()
    {
    	TIM_SetCompare2(TIM3,0);
    	LED1=1;	
    }
     int main(void)  
     {		
    	delay_init();	    	 //延时函数初始化	  
    	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); 	 //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
    	uart_init(115200);	 //串口初始化为115200
     	LED_Init();			     //LED端口初始化
     	TIM3_PWM_Init(899,0);	 //不分频。PWM频率=72000000/900=80Khz
    	TIM_SetCompare2(TIM3,led0pwmval);
    	LED1=0;
       	while(1)
    	{
    		if(USART_RX_STA&0x8000)
    		{
    			LED0=1;
    			USART_ITConfig(USART1,USART_IT_RXNE,DISABLE);
    			Cmd_ack();
    			if(USART_RX_BUF[1]==0xAA) Flash_N(USART_RX_BUF[3]);
    			else if(USART_RX_BUF[1]==0xBB) 	Change_N(USART_RX_BUF[3]);
    			else if(USART_RX_BUF[1]==0xCC) 	Close_Led();
    			USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);//开启接收中断
    			USART_RX_STA=0;
    		}
    	}	 
     }
    
    
    
    • 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
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
  • 相关阅读:
    There are test failures.【非常详细,已解决】
    java注解和通过反射获取注解值
    屏幕录像软件camtasia2022汉化版好用的录屏软件
    Redis集群安装之分片集群
    go语言中的私聊功能处理
    详解Transformer中的Encoder
    数据提取1
    【代码】Android|获取存储权限并创建、存储文件
    【数学建模】MATLAB应用实战系列(八十八)-组合权重法应用案例(附MATLAB和Python代码)
    冒泡排序和选择排序的小乐趣
  • 原文地址:https://blog.csdn.net/canola_flowers/article/details/126248506