STM32mini板按键控制双路PWM波
学习记录:
pwm在单片机中实用性很高,在stm32上,按原理就是通过输出不同的占空比来控制引脚的输出电压,此次通过mini板的三个按键,来控制PA7、PA8管脚输出电压
在正点原子mini板所给的寄存器例程中已经给出LED0(PA8)的闪烁实验,我们要再此基础上对程序进行改进,下面是如何配置PA7管脚。
1、经查阅芯片手册,PA7所用到的是定时器3的通道2,将pwm.c文件内添加定时器3的初始化函数
#ifndef __PWM_H
#define __PWM_H
#include "sys.h"
void TIM1_PWM_Init(u16 arr,u16 psc);
void TIM3_PWM_Init(u16 arr,u16 psc);
#endif
2、所以在PWM.c文件内把TIM1_Init函数在下面复制一遍,并修改定时器3GPIO的使能参数(好久都没用keil,注释我也就懒得改了),将引脚使能改为PA7,
void TIM3_PWM_Init(u16 arr,u16 psc)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);//
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //ʹÄÜGPIOÍâÉèʱÖÓʹÄÜ
//ÉèÖøÃÒý½ÅΪ¸´ÓÃÊä³ö¹¦ÄÜ,Êä³öTIM1 CH1µÄPWMÂö³å²¨ÐÎ
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; //TIM_CH1
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //¸´ÓÃÍÆÍìÊä³ö
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
TIM_TimeBaseStructure.TIM_Period = arr; //ÉèÖÃÔÚÏÂÒ»¸ö¸üÐÂʼþ×°Èë»î¶¯µÄ×Ô¶¯ÖØ×°ÔؼĴæÆ÷ÖÜÆÚµÄÖµ 80K
TIM_TimeBaseStructure.TIM_Prescaler =psc; //ÉèÖÃÓÃÀ´×÷ΪTIMxʱÖÓƵÂʳýÊýµÄÔ¤·ÖƵֵ ²»·ÖƵ
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //ÉèÖÃʱÖÓ·Ö¸î:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIMÏòÉϼÆÊýģʽ
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //¸ù¾ÝTIM_TimeBaseInitStructÖÐÖ¸¶¨µÄ²ÎÊý³õʼ»¯TIMxµÄʱ¼ä»ùÊýµ¥Î»
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //Ñ¡Ôñ¶¨Ê±Æ÷ģʽ:TIMÂö³å¿í¶Èµ÷ÖÆģʽ2
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //±È½ÏÊä³öʹÄÜ
TIM_OCInitStructure.TIM_Pulse = 0; //ÉèÖôý×°È벶»ñ±È½Ï¼Ä´æÆ÷µÄÂö³åÖµ
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //Êä³ö¼«ÐÔ:TIMÊä³ö±È½Ï¼«ÐÔ¸ß
TIM_OC2Init(TIM3, &TIM_OCInitStructure); //¸ù¾ÝTIM_OCInitStructÖÐÖ¸¶¨µÄ²ÎÊý³õʼ»¯ÍâÉèTIMx
TIM_CtrlPWMOutputs(TIM3,ENABLE); //MOE Ö÷Êä³öʹÄÜ
TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable); //CH1ԤװÔØʹÄÜ
TIM_ARRPreloadConfig(TIM3, ENABLE); //ʹÄÜTIMxÔÚARRÉϵÄԤװÔؼĴæÆ÷
TIM_Cmd(TIM3, ENABLE); //ʹÄÜTIM1
}
3、把key.c夹文件加入HARDWARE中,并在主函数添加key.h头文件,初始化按键函数,通过按键按下也可以观察到LED0亮度的变化
int main(void)
{
vu8 t;
u16 led0pwmval=100,led1pwmval=100;//开始时先给LED0一个亮度
// u8 dir=1;
KEY_Init();
delay_init(); //ÑÓʱº¯Êý³õʼ»¯
LED_Init(); //³õʼ»¯ÓëLEDÁ¬½ÓµÄÓ²¼þ½Ó¿Ú
TIM1_PWM_Init(899,0);//²»·ÖƵ¡£PWMƵÂÊ=72000/(899+1)=80Khz
TIM3_PWM_Init(899,0);//²»·ÖƵ¡£PWMƵÂÊ=72000/(899+1)=80Khz
while(1)
{
t=KEY_Scan(0); //所定义按键的返回值
delay_ms(10);
if(t==1)led0pwmval+=10,led1pwmval+=10;//按键调整输出占空比
else if(t==2) led0pwmval-=10;
else if (t==3) led1pwmval-=10;
// if(led0pwmval>300) led0pwmval=100;
// if(led0pwmval==0) dir=1;
TIM_SetCompare1(TIM1,led0pwmval);
TIM_SetCompare2(TIM3,led1pwmval);
}
}
4、OVER!!!
PS:学会配置STM32CubeMX可以提高工作效率!