【嵌入式系统实验】实验七 PWM实验

本文章参考网页http://www.51hei.com/bbs/dpj-190888-1.html

1.实验环境

(1)Keil uVision5
(2)STM32F407ZGT6

2.实验内容

1、实现用正弦波的数值控制LED0闪烁;
2、同时将该控制量送串口输出正弦波波形;
3、用KEY0中断方式控制启动和停止。
按下KEY0, LED0开始闪烁,串口输出波形。
再次按下KEY0, LED0和输出波形都暂停;
第三次按KEY0, LED0和输出波形都能恢复,并和原来的状态衔接上,即保持闪烁的完整性和波形的完整性。
4、 特别重要: 中途重启计算机或做完实验关机时, 必须下载一个其他程序到实验板中,比如实验二跑马灯;或者运行桌面的FlyMCU,点击清除芯片功能。 否则重启计算机后鼠标可能工作不正常。

3.实验代码

【exti.c】

extern int state;//表示当前PWM输出的状态 0-停止,1-启动
extern int sinval;

//外部中断4服务程序
void EXTI4_IRQHandler(void)
{
    
    
	delay_ms(10);	//消抖
	if(KEY0==0)	 
	{
    
    
     if(state==0) state=1;//当前输出波形停止时,
     else  state=0;	     //当前正在输出波形时
			 	 
	}		 
	 EXTI_ClearITPendingBit(EXTI_Line4);//清除LINE4上的中断标志位  
}

【main.c】

#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "pwm.h"
#include "exti.h"
#include "key.h"
#include "math.h"

#define PI 3.14159265
int state=0;//表示当前PWM输出的状态 0-停止,1-启动
int sinval=0;			//sin()的()里的值

int main(void)
{
    
     
	double led0pwmval=0;  //比较值 
  int i;	
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
	delay_init(168);  //初始化延时函数
	uart_init(115200);//初始化串口波特率为115200
	EXTIX_Init();//初始化外部中断输入
 	TIM14_PWM_Init(500-1,84-1);	//84M/84=1Mhz的计数频率,重装载值500,所以PWM频率为 1M/500=2Khz. 	
   while(1) //实现比较值从0-300递增,到300后从300-0递减,循环
	{
    
    
 		delay_ms(10);	
 		if(sinval>=360)sinval=0;//sinval到达360后,一个周期的正弦波结束,从0继续重新开始		
		if(state==1)
		{
    
    
			led0pwmval=sin(sinval*PI/180)*150+150;//[-150,150]--->[0,300]
			if(sinval%3==0)//输出波形
			{
    
    
				for(i=0;i<led0pwmval/3;i++)//空格
				  printf(" ");
				printf("*\r\n");//\r表示回车到本行首行
			}
			TIM_SetCompare1(TIM14,led0pwmval);	//修改比较值,修改占空比
			sinval=sinval+4;//[0,360]--->[0,2Π]
		}
		else
			TIM_SetCompare1(TIM14,0);	//修改比较值,修改占空比
	}
}

4.注意事项

(1)串口助手要取消时间戳。

猜你喜欢

转载自blog.csdn.net/qq_41315788/article/details/108754372