STM32f4日記1之輸出pwm波(用按鍵調整頻率,占空比,可用示波器觀察結果)
選用板子:正點原子stm32f407zgt6迷你板
如果你覺得這篇文章對你有用,請記得點贊同,這對我很重要,
使用到OLED顯示當前輸出的頻率和占空比
實驗儀器:示波器(黑色接地,紅色接PF8)
使用公母頭杜邦線,可以用公公頭跟母母頭拼出來
以下是pwm.c里的代碼(定時器Tim13 IO口為PF8)
void TIM13_PWM_Init(u32 arr,u32 psc)//入口引數arr psc分頻系數根據單片機型號定在main.c里使用
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM13,ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);
GPIO_PinAFConfig(GPIOF,GPIO_PinSource8,GPIO_AF_TIM13);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //GPIOF8
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //復用
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //100MHz
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //pp
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉默認高電平
GPIO_Init(GPIOF,&GPIO_InitStructure); //PF8
TIM_TimeBaseStructure.TIM_Prescaler=psc; //設定分頻系數
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //定時器向上計數
TIM_TimeBaseStructure.TIM_Period=arr; //設定arr
TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_TimeBaseInit(TIM13,&TIM_TimeBaseStructure);//
//TIM13 Channel1
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //pwm1模式
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //極性高
TIM_OC1Init(TIM13, &TIM_OCInitStructure); //初始化tim13 oc1
TIM_OC1PreloadConfig(TIM13, TIM_OCPreload_Enable); //
TIM_ARRPreloadConfig(TIM13,ENABLE);//使能arr
TIM_Cmd(TIM13, ENABLE); //使能tim13
}
以下是pwm.h里面的代碼
#ifndef _TIMER_H
#define _TIMER_H
#include "sys.h"
void TIM13_PWM_Init(u32 arr,u32 psc);
#endif
以下是主函式里面的代碼
代碼功能:
初始占空比1%
初始頻率1500
按下key0占空比每次加2
按下wkup頻率每次加100當頻率大于1500清為100
#include "sys.h"
#include "delay.h"
//#include "timer.h"
#include "led.h"
#include "string.h"
#include "pwm.h"
#include "key.h"
#include "usart.h"
#include "oled.h"
// #include "waishekey.h"
//extern u8 TIM5CH1_CAPTURE_STA;
//extern u8 count;
//extern u32 TIM5CH1_CAPTURE_UP1;
//extern u32 TIM5CH1_CAPTURE_UP2;
//extern u32 TIM5CH1_CAPTURE_DOWN; //這些是為輸入捕獲準備的請忽略
// PF8 用來接示波器
// PE5 用來接信號發生器,本實驗不用
int main(void)
{
//u32 temp_f=0;
//float temp_d=0;
u8 key;
u8 key1;
int t=1500; //
int duty=1; //
char buffer1[100];
char buffer2[100];
char buffer3[100];
char buffer4[100];
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//設定中斷
TIM13_PWM_Init(1500-1,84-1); //最重要的初始化 arr1000 設定TIM13初始arr1500 分頻84
delay_init(168); //初始化delay
KEY_Init(); //初始化鍵盤
uart_init(115200); //′初始化串口本實驗不用
OLED_Init(); //初始化oled
OLED_Clear();
//TIM5_CH1_Cap_Init(0XFFFFFFFF,42-1); //輸入捕獲,本實驗不用
//sprintf(buffer1,"in duty:%5.1f%%",temp_d);
//sprintf(buffer2,"in freq:%.1uHZ",temp_f);
sprintf(buffer3,"out duty:%3d%%",duty);
sprintf(buffer4,"out freq:%dHZ",t);
while(1)
{
//sprintf(buffer1,"in duty:%5.1f%%",temp_d);
//sprintf(buffer2,"in freq:%.1uHZ", temp_f);
sprintf(buffer3,"out duty:%3d%%",duty);
sprintf(buffer4,"out freq:%dHZ",t);
//OLED_ShowString(0,0,buffer1,16);
//OLED_ShowString(0,16,buffer2,16);
OLED_ShowString(0,32,buffer3,16);
OLED_ShowString(0,48,buffer4,16);
OLED_Refresh();
key=KEY_Scan(0);
if(key)
{
switch(key)
{
case WKUP_PRES: //
t+=100;
if(t>1500)t=100;
TIM_SetCompare1(TIM13,1000000/t*(duty/100.0));
TIM_SetAutoreload(TIM13,1000000/t-1);
break;
case KEY0_PRES: //
duty+=2;
if(duty>100)duty=0;
TIM_SetCompare1(TIM13,1000000/t*(duty/100.0));
break;
}
}
}
}
下一篇文章會講輸入捕獲實驗,用到信號發生器(可將兩者綜合一個輸出pwm一個捕獲pwm,就不用儀器了)
敬請期待---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
作者:shawn
QQ:965798711 可咨詢
2020.12.19 00:37
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/237728.html
標籤:其他
