历史上的今天
今天是:2024年09月20日(星期五)
2018年09月20日 | STM32 PWM 占空比可变函数
2018-09-20 来源:eefocus
频率 10K,占空比可以达到1%变化的精度,100K只能是10%的变化精度。
#define PWM_CLK1M_ARR_10K 100-1
void IzADCPWMInit(uint8_t duty)//10%~90%
{
if(duty>90)
{
duty = 90;
}
if(duty<10)
{
duty = 10;
}
//reset
/* TIM4 enable counter */
TIM_Cmd(TIM4, DISABLE);
/* TIM4 Main Output Enable */
TIM_CtrlPWMOutputs(TIM4, DISABLE);
//end of reset
/* System Clocks Configuration */
RCCPWMADCConfiguration();
/* GPIO Configuration */
GPIOPWMADCConfiguration();
/* -----------------------------------------------------------------------
TIM3 Configuration: generate 4 PWM signals with 4 different duty cycles:
The TIM3CLK frequency is set to SystemCoreClock (Hz), to get TIM3 counter
clock at 24 MHz the Prescaler is computed as following:
- Prescaler = (TIM3CLK / TIM3 counter clock) - 1
SystemCoreClock is set to 72 MHz for Low-density, Medium-density, High-density
and Connectivity line devices and to 24 MHz for Low-Density Value line and
Medium-Density Value line devices
The TIM3 is running at 36 KHz: TIM3 Frequency = TIM3 counter clock/(ARR + 1)
= 24 MHz / 666 = 36 KHz
TIM3 Channel1 duty cycle = (TIM3_CCR1/ TIM3_ARR)* 100 = 50%
TIM3 Channel2 duty cycle = (TIM3_CCR2/ TIM3_ARR)* 100 = 37.5%
TIM3 Channel3 duty cycle = (TIM3_CCR3/ TIM3_ARR)* 100 = 25%
TIM3 Channel4 duty cycle = (TIM3_CCR4/ TIM3_ARR)* 100 = 12.5%
----------------------------------------------------------------------- */
/* Compute the prescaler value */
//PrescalerValue = (uint16_t) (SystemCoreClock / 24000000) - 1;//24M
//TIM3 Frequency=1MHz/(9999+1) =100Hz
PrescalerValue = (uint16_t) (SystemCoreClock / 1000000) - 1; //TIM3 counter clock: 1MHz
/* Time base configuration */
//TIM_TimeBaseStructure.TIM_Period = 665;//(ARR)
//TIM3 Frequency=1MHz/(9999+1) =100Hz
//TIM_TimeBaseStructure.TIM_Period = 10000-1; //TIM3 counter clock/TIM3 Frequency
//TIM3 Frequency=1MHz/(99+1) =10 000Hz
TIM_TimeBaseStructure.TIM_Period = PWM_CLK1M_ARR_10K;//PWM_CLK1M_ARR_100; //TIM3 counter clock/TIM3 Frequency
TIM_TimeBaseStructure.TIM_Prescaler = PrescalerValue;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);
/* PWM1 Mode configuration: Channel1 */
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
//CCR1_Val =TIM3_ARR*duty/100;
// TIM_OCInitStructure.TIM_Pulse = CCR1_Val;
// TIM_OCInitStructure.TIM_Pulse = (uint16_t)(10000-1)*duty/100;
TIM_OCInitStructure.TIM_Pulse = (uint16_t)(PWM_CLK1M_ARR_10K)*duty/100;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
// TIM_OC1Init(TIM3, &TIM_OCInitStructure);
// TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);
//PB6: TM4 Channel1
TIM_OC1Init(TIM4, &TIM_OCInitStructure);
TIM_OC1PreloadConfig(TIM4, TIM_OCPreload_Enable);
//PB8: TM4 Channel3
/* PWM1 Mode configuration: Channel3 */
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = (uint16_t)(PWM_CLK1M_ARR_10K)*duty/100;
TIM_OC3Init(TIM4, &TIM_OCInitStructure);
TIM_OC3PreloadConfig(TIM4, TIM_OCPreload_Enable);
//PB7: TM4 Channel2
/* PWM1 Mode configuration: Channel2 */
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = (uint16_t)(PWM_CLK1M_ARR_10K)*duty/100; ;
TIM_OC2Init(TIM4, &TIM_OCInitStructure);
TIM_OC2PreloadConfig(TIM4, TIM_OCPreload_Enable);
#if 0
/* PWM1 Mode configuration: Channel4 */
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = CCR4_Val;
TIM_OC4Init(TIM3, &TIM_OCInitStructure);
TIM_OC4PreloadConfig(TIM3, TIM_OCPreload_Enable);
#endif
TIM_ARRPreloadConfig(TIM4, ENABLE);
/* TIM4 enable counter */
TIM_Cmd(TIM4, ENABLE);
/* TIM4 Main Output Enable */
TIM_CtrlPWMOutputs(TIM4, ENABLE);
}
上一篇:对STM32的CAN1模块的总结
史海拾趣
|
哥们收集的几个MP3的方案原理图,有ALIM5661X(俗称阿里方案)/炬力ATJ2055/ATJ2091/ATJ2135/凌阳SPDA1000/瑞星微2608A,有需要的朋友来看看吧,欢迎补充.....… 查看全部问答> |
|
虚拟FPGA逻辑验证分析仪的设计 随着FPGA技术的广泛使用,越来越需要一台能够测试验证FPGA芯片中所下载电路逻辑时序是否正确的仪器。目前,虽然Agilent、Tektronix 等大公司生产的高端逻辑分析仪能够实现FPGA电路的测试验证功能,但此类仪器价格高 ...… 查看全部问答> |
|
学C++人不得不看的好帖! 做为一名大四的学生,我面试过不少的单位,有成功的也有失败的,但是对我来说所有的失败在某种意义上都是一种成功,特别是我下面写的这些,写这篇文章的时候,我已经签了南京的一家软件司,但是想起今年2月21日我面试苏州 ...… 查看全部问答> |
|
初次接触Ce,现在用EVC在PDA下做一个单文档的程序,今天发现一个问题,在打开窗体后,即使我控制了窗体的大小,但在PDA上仍然显示全屏,导致我的菜单栏被覆盖。我用的movewindow控制窗体大小。窗体显示模式为domodal。如何通过程序控制窗体的显示大 ...… 查看全部问答> |
|
1、 // show Camera // dwLenIn = 1 : Normal overlay // dwLenIn = 4 : Alphablending // &n ...… 查看全部问答> |
|
reg select; select = !select; //语句1 select = ~select; //语句2 语句1和语句2有什么区别,都有什么执行效果?… 查看全部问答> |




