嵌入式 PWM
回帖(1)
2022-2-28 11:40:16
一、必备知识
输出pwm波首先要设置的就是频率
普及:T=1/f(f越大T越小)
1M Hz = 1000K Hz = 1000000Hz
1 Hz = 1s
1K Hz = 1ms
10K Hz=0.1ms
1M Hz = 1um
只需要了解:自动重装载arr 预分频psc
1、时钟源
定时器时钟TIMxCLK,即内部时钟CK_INT,经APB1预分频器后分频提供,如果APB1 预分频系数等于 1,则频率不变,否则频率乘以 2,库函数中 APB1 预分频的系数是 2,即 PCLK1=36M,所以定时器时钟 TIMxCLK=36*2=72M 。
2、预分频
预分频两种方式(每个人习惯不一样常见的两种):
(1)给psc赋值为72(7200)等一些比较好计算的值
TIM_TimeBaseStructure.TIM_Period = arr-1;//把时钟平分为多少等份(每一段就是一个小周期)
TIM_TimeBaseStructure.TIM_Prescaler = psc-1;//定时器时钟的频率72Mhz/84Mhz
(2)跟(1)的分频方式不一样,分频值得原理一样
//TIM2预分频设置:1MHZ,APB1分频系数2,输入到TIM3时钟为36MHzx2 = 72MHz
TIM_PrescalerConfig(TIM2,71, TIM_PSCReloadMode_Immediate);
这张图可以帮你更好的理解arr和ccr占空比设置的原理
3、管脚重映射语句 TIM3为例(两个参数参数:1.TIMx是完全重映射还是部分重映射 2.使能)
GPIO_PinRemapConfig(GPIO_PartialRemap_TIMx, ENABLE);
//GPIO_PartialRemap_TIM3 TIM3 复用功能部分映射
//GPIO_FullRemap_TIM3 TIM3 复用功能完全映射
一、频率设置
我的误区(借鉴):知道频率和时间为反比,但是思考的时候认为1M Hz是1us 那么10K Hz肯定比是0.01us怎么就想不明白,就在那死熬,知道自己肯定哪里错了,但是就是看不出来,难了我一上午,恍然大迷瞪。希望各位不要在这入坑。
频率:(两个例子可以理解一下)
eg1:假设arr=1000-1 预分频psc=72-1。设分频之后值(Fp)。周期(T)
Fp=72M Hz / 72 = 1M Hz =1um=0.001ms
T:Fp x arr(1000)=1ms=0.001s
频率f=1/T = 1 / 0.001 = 1000Hz = 1K Hz
eg2:假设arr=10-1 预分频psc=7200-1。设分频之后值(Fp)。周期(T)
Fp=72M Hz /7200-1 = 10K Hz =0.1ms
T:Fp x arr (10) = 1ms = 0.001s
频率f=1/T = 1 / 0.001 = 1000Hz = 1K Hz
二、占空比设置
设置占空比的方法两种
方法一:给crr(600)赋值,参考arr(1000)的值,此时占空比为60%
void Init_Pwm(uint16_t ccr)
{
,,,;
,,,;
,,,;
,,,;
TIM_OCInitStruct.TIM_OCMode=TIM_OCMode_PWM2;//pwm模式二
TIM_OCInitStruct.TIM_OCPolarity=TIM_OCPolarity_Low;//输出极性低
TIM_OCInitStruct.TIM_OutputState=TIM_OutputState_Enable;//比较输出使能
TIM_OCInitStruct.TIM_Pulse=ccr;
TIM_OC2Init(TIM3,&TIM_OCInitStruct);//打开通道2
}
方法二:在配置通道的时候不配置ccr的值,在主函数里面调用库函数里面的修改ccr值的函数。
调用函数:void TIM_SetCompare2(TIM_TypeDef* TIMx, uint16_t Compare2);
给crr(6) arr(10) 占空比为60%
TIM_SetCompare2(TIM3,crr);
总结
第一次写博客,由于一直想写,看到身边的人也都在写博客。加上由于这个问题我花费了好多时间才弄明白,决定抽出时间,写一篇让自己加入到这个大家庭当中,希望大家多多支持。有错误的话,欢迎大神指正,写这个也是督促自己学习。
一、必备知识
输出pwm波首先要设置的就是频率
普及:T=1/f(f越大T越小)
1M Hz = 1000K Hz = 1000000Hz
1 Hz = 1s
1K Hz = 1ms
10K Hz=0.1ms
1M Hz = 1um
只需要了解:自动重装载arr 预分频psc
1、时钟源
定时器时钟TIMxCLK,即内部时钟CK_INT,经APB1预分频器后分频提供,如果APB1 预分频系数等于 1,则频率不变,否则频率乘以 2,库函数中 APB1 预分频的系数是 2,即 PCLK1=36M,所以定时器时钟 TIMxCLK=36*2=72M 。
2、预分频
预分频两种方式(每个人习惯不一样常见的两种):
(1)给psc赋值为72(7200)等一些比较好计算的值
TIM_TimeBaseStructure.TIM_Period = arr-1;//把时钟平分为多少等份(每一段就是一个小周期)
TIM_TimeBaseStructure.TIM_Prescaler = psc-1;//定时器时钟的频率72Mhz/84Mhz
(2)跟(1)的分频方式不一样,分频值得原理一样
//TIM2预分频设置:1MHZ,APB1分频系数2,输入到TIM3时钟为36MHzx2 = 72MHz
TIM_PrescalerConfig(TIM2,71, TIM_PSCReloadMode_Immediate);
这张图可以帮你更好的理解arr和ccr占空比设置的原理
3、管脚重映射语句 TIM3为例(两个参数参数:1.TIMx是完全重映射还是部分重映射 2.使能)
GPIO_PinRemapConfig(GPIO_PartialRemap_TIMx, ENABLE);
//GPIO_PartialRemap_TIM3 TIM3 复用功能部分映射
//GPIO_FullRemap_TIM3 TIM3 复用功能完全映射
一、频率设置
我的误区(借鉴):知道频率和时间为反比,但是思考的时候认为1M Hz是1us 那么10K Hz肯定比是0.01us怎么就想不明白,就在那死熬,知道自己肯定哪里错了,但是就是看不出来,难了我一上午,恍然大迷瞪。希望各位不要在这入坑。
频率:(两个例子可以理解一下)
eg1:假设arr=1000-1 预分频psc=72-1。设分频之后值(Fp)。周期(T)
Fp=72M Hz / 72 = 1M Hz =1um=0.001ms
T:Fp x arr(1000)=1ms=0.001s
频率f=1/T = 1 / 0.001 = 1000Hz = 1K Hz
eg2:假设arr=10-1 预分频psc=7200-1。设分频之后值(Fp)。周期(T)
Fp=72M Hz /7200-1 = 10K Hz =0.1ms
T:Fp x arr (10) = 1ms = 0.001s
频率f=1/T = 1 / 0.001 = 1000Hz = 1K Hz
二、占空比设置
设置占空比的方法两种
方法一:给crr(600)赋值,参考arr(1000)的值,此时占空比为60%
void Init_Pwm(uint16_t ccr)
{
,,,;
,,,;
,,,;
,,,;
TIM_OCInitStruct.TIM_OCMode=TIM_OCMode_PWM2;//pwm模式二
TIM_OCInitStruct.TIM_OCPolarity=TIM_OCPolarity_Low;//输出极性低
TIM_OCInitStruct.TIM_OutputState=TIM_OutputState_Enable;//比较输出使能
TIM_OCInitStruct.TIM_Pulse=ccr;
TIM_OC2Init(TIM3,&TIM_OCInitStruct);//打开通道2
}
方法二:在配置通道的时候不配置ccr的值,在主函数里面调用库函数里面的修改ccr值的函数。
调用函数:void TIM_SetCompare2(TIM_TypeDef* TIMx, uint16_t Compare2);
给crr(6) arr(10) 占空比为60%
TIM_SetCompare2(TIM3,crr);
总结
第一次写博客,由于一直想写,看到身边的人也都在写博客。加上由于这个问题我花费了好多时间才弄明白,决定抽出时间,写一篇让自己加入到这个大家庭当中,希望大家多多支持。有错误的话,欢迎大神指正,写这个也是督促自己学习。
举报
更多回帖