如何做网站热力图,透明主题wordpress,权威发布图片红字,企业营销策划实训报告STM32定时器之输入捕获总结 OC介绍PWM介绍PWM初始化代码部分开启时钟配置时基单元配置CCR配置GPIO配置复用和重定义功能 开启定时器代码实现 #xff1a;实现呼吸灯 OC介绍 PWM介绍 PWM参数计算 分辨率越细#xff0c;分的分量越精细#xff0c;越稳定#xff0c;假如它为… STM32定时器之输入捕获总结 OC介绍PWM介绍PWM初始化代码部分开启时钟配置时基单元配置CCR配置GPIO配置复用和重定义功能 开启定时器代码实现 实现呼吸灯 OC介绍 PWM介绍 PWM参数计算 分辨率越细分的分量越精细越稳定假如它为1%,则它可使得风扇以1为单位的等级调速。可以从1调到100档位假如它为50%那么只有两个档位。50和 100。
计算 如果我现在想要生成一个 PWM频率为1KHZ占空比可以为任意PWM分辨率为1%则PSC(分频器系数)ARR重装值应改为多少呢
Reso分辨率1%1/100 ,又因为Reso1/ARR1 故而ARR100-199。
PWM频率1k1000 CK_PSC / PSC1* ARR 1
由于CK_PSC在上篇文章中已经介绍为72MHz。 故而
式子 CK_PSC / PSC1* ARR 1PWM频率 变为 72000000 / (PSC 1) *(99 1)1000故而PSC720 -1
PWM初始化代码部分
挨个配置 打通这条路即可
开启时钟配置 //通用定时器TIM2时钟开启RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);//开启GPIO的时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//内部时钟配置方便TIM_InternalClockConfig(TIM2);时基单元配置 //配置时基单元TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;TIM_TimeBaseInitStructure.TIM_ClockDivisionTIM_CKD_DIV1;TIM_TimeBaseInitStructure.TIM_CounterModeTIM_CounterMode_Up;//向上计数的模式TIM_TimeBaseInitStructure.TIM_Period100 -1;//重装值ARR,根据上面公式计算TIM_TimeBaseInitStructure.TIM_Prescaler720 -1;//psc 根据上面公式计算TIM_TimeBaseInitStructure.TIM_RepetitionCounter0;TIM_TimeBaseInit(TIM2,TIM_TimeBaseInitStructure);CCR配置 //配置CCRTIM_OCInitTypeDef TIM_OCInitStructure;TIM_OCStructInit(TIM_OCInitStructure);//给所有成员变量先赋个初值//下面单独修改通用定时器才用到的成员变量TIM_OCInitStructure.TIM_OCModeTIM_OCMode_PWM1 ;//PWM1模式参考pptP68PWM1模式和PWM2模式的区别TIM_OCInitStructure.TIM_OCPolarityTIM_OCPolarity_High;//CNTCCR时REF置有效电平参考pptP69TIM_OCInitStructure.TIM_OutputStateTIM_OutputState_Enable;//输出使能TIM_OCInitStructure.TIM_Pulse 50;//设置CCR 即输出比较的值 这里随便给个测试占空比50%TIM_OC1Init(TIM2, TIM_OCInitStructure);注意上面用到了TIM_OCStructInit(TIM_OCInitStructure);给所有成员变量赋值这是为什么呢 原因如下 TIM_OCInitStructure.TIM_OCIdleState和TIM_OCInitStructure.TIM_OutputNState: Idle和里面含有N的一般都是高级定时器才用的 我们用到的都是通用定时器,但TIM_OCInitStructure成员里面有我们用不到的例如刚才的TIM_OCInitStructure.TIM_OCIdleState //那如果我们不给未用到的成员赋初值那么后续就会有各种问题。 //这里可以使用TIM_OCStructInit()函数给所有成员给个默认值然后单独再修改通用定时器模块的成员变量的值。
GPIO配置 GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_ModeGPIO_Mode_AF_PP;//复用推挽输出GPIO_InitStructure.GPIO_PinGPIO_Pin_0;//观察引脚图可知引脚定义ppt11页可知GPIO_PA0有引脚复用的CH1GPIO_InitStructure.GPIO_SpeedGPIO_Speed_50MHz;GPIO_Init(GPIOA,GPIO_InitStructure);
这里解释下为何复用推挽因为下图来自片上外设一般使用复用功能输出 复用和重定义功能
引脚复用Pin Multiplexing是指单个物理引脚可以根据需要被不同的功能模块使用。在许多现代的微控制器中物理引脚的功能并不是固定的而是可以通过软件配置进行更改这样可以使同一个引脚实现多种功能这就是引脚复用。这种设计可以有效地节省物理引脚提高了系统的灵活性。
重定义功能Alternate Function则是指在引脚复用功能中每个物理引脚可以被分配多种不同的功能这些功能通常是由于同一个引脚在不同的模式下所承担的功能不同而产生的。例如同一个物理引脚在GPIO模式下可以用作普通的数字输入/输出引脚而在UART模式下可以用作串行通信的引脚。在这种情况下这个物理引脚就具有了两种不同的重定义功能。 开启定时器
最后一定要开启定时器
TIM_Cmd(TIM2,ENABLE);//开启定时器如何更改占空比的值 即CCR 使用TIM_SetCompare1函数即可
代码实现 实现呼吸灯
PWM.c c
#include stm32f10x.h // Device header
/*** brief PWM初始化* param 无* retval 无*/
void PWM_Init(void)
{RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);//开启GPIO的时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//内部时钟配置TIM_InternalClockConfig(TIM2);//配置时基单元TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;TIM_TimeBaseInitStructure.TIM_ClockDivisionTIM_CKD_DIV1;TIM_TimeBaseInitStructure.TIM_CounterModeTIM_CounterMode_Up;//向上计数的模式TIM_TimeBaseInitStructure.TIM_Period100 -1;//重装值ARRTIM_TimeBaseInitStructure.TIM_Prescaler7200 -1;//pscTIM_TimeBaseInitStructure.TIM_RepetitionCounter0;TIM_TimeBaseInit(TIM2,TIM_TimeBaseInitStructure);//配置CCRTIM_OCInitTypeDef TIM_OCInitStructure;//TIM_OCInitStructure.TIM_OCIdleState和TIM_OCInitStructure.TIM_OutputNState: Idle和里面含有N的一般都是高级定时器才用的//我们用到的都是通用定时器,但TIM_OCInitStructure成员里面有我们用不到的例如刚才的TIM_OCInitStructure.TIM_OCIdleState//那如果我们不给未用到的成员赋初值那么后续就会有各种问题。//这里可以使用TIM_OCStructInit()函数给所有成员给个默认值然后单独再修改通用定时器模块的成员变量的值。TIM_OCStructInit(TIM_OCInitStructure);//给所有成员变量先赋个初值//下面单独修改通用定时器才用到的成员变量TIM_OCInitStructure.TIM_OCModeTIM_OCMode_PWM1 ;//PWM1模式参考pptP68PWM1模式和PWM2模式的区别TIM_OCInitStructure.TIM_OCPolarityTIM_OCPolarity_High;//CNTCCR时REF置有效电平参考pptP69TIM_OCInitStructure.TIM_OutputStateTIM_OutputState_Enable;//输出使能TIM_OCInitStructure.TIM_Pulse 0;//设置CCR 即输出比较的值 这里随便给个测试后面通过函数TIM_SetCompare1单独更改TIM_OC1Init(TIM2, TIM_OCInitStructure);//GPIO配置GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_ModeGPIO_Mode_AF_PP;//复用推挽输出为何用复用推挽因为ppt20页码GPIO_InitStructure.GPIO_PinGPIO_Pin_0;//观察引脚图可知引脚定义ppt11页可知GPIO_PA0有引脚复用的CH1GPIO_InitStructure.GPIO_SpeedGPIO_Speed_50MHz;GPIO_Init(GPIOA,GPIO_InitStructure);TIM_Cmd(TIM2,ENABLE);//开启定时器}
/*** brief 设置占空比 * param CompareCCR比较/捕获 占空比 * retval 无*/void PWM_SetCompare1(uint16_t Compare)
{TIM_SetCompare1(TIM2,Compare);
}main .c
#include stm32f10x.h // Device header
#include OLED.h
#include PWM.h
#include Delay.h
uint8_t i;
int main()
{OLED_Init();PWM_Init();while(1){for(i0;i100;i)//逐渐变亮{PWM_SetCompare1(i);Delay_ms(10);}for(i0;i100;i){PWM_SetCompare1(100-i);//逐渐变灭Delay_ms(10);}}}