|
新驱动力MM32F103测试(四)高级定时器PWM
[复制链接]
本帖最后由 lising 于 2018-11-1 10:20 编辑
本次实验是利用MM32F103C8T6高级定时器TIM1的CH1输出频率为100KHz的PWM波驱动LED发光。
一、实验资源
1、MM32F103开发板;
2、KEIL 5.25.2;
3、J-LINK V9;
4、新驱动力提供的开发例程;
二、实验过程
1、根据电路图可以了解到,开发板上的LED发光管D2与MM32F103C8T6芯片的PA8端口相连。由于D2阴极端接PA8端口,当PA8为低电平时LED被点亮;根据数据手册可知PA8端口的复用功能为TIM1_CH1,实验直接利用TIM1的CH1在PA8端口输出频率为100KHz且占空比可变的PWM波,驱动D2产生暗->渐亮->亮->渐暗->暗的显示效果。
2、PWM输出程序直接利用官方例程修改而成。程序中首先对TIM1_CH1进行初始化设置,如将PWM频率直接配置为100KHz、采用PWM模式2等,代码如下:
- void TIM1_PWM_Init(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
- TIM_OCInitTypeDef TIM_OCInitStructure;
-
- /*使能GPIO外设和TIM1时钟*/
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
-
- /*设置PA8复用输出功能,输出TIM1_CH1的PWM脉冲*/
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOA, &GPIO_InitStructure);
- /*设置自动重装载寄存器周期的值为720-1,即PWM周期为72MHz/720=100KHz;
- 定时器时钟预分频数为0;采用向上计数;PWM为模式2;输出极性高;*/
- TIM_TimeBaseStructure.TIM_Period = (720-1);
- TIM_TimeBaseStructure.TIM_Prescaler = 0;
- TIM_TimeBaseStructure.TIM_ClockDivision = 0;
- TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
- TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);
-
- TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
- TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
- TIM_OCInitStructure.TIM_Pulse = 0;
- TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
- TIM_OC1Init(TIM1, &TIM_OCInitStructure);
- TIM_CtrlPWMOutputs(TIM1,ENABLE); //MOE 主输出使能
- TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable); //CH1预装载使能
- TIM_ARRPreloadConfig(TIM1, ENABLE); //使能TIM1在ARR上的预装载寄存器
- TIM_Cmd(TIM1, ENABLE); //使能TIM1
- }
复制代码
3、功能实现。在主程序中首先对初始化程序时进行调用,在while(1)循环中以采用了两个for循环语句以5ms时间间隔将变化的参数写入TIM1_CCR1,用以改变PWM的占空比:
- int main(void)
- {
- delay_init(); //延时函数初始化
- LED_Init(); //初始化与LED连接的硬件接口
- TIM1_PWM_Init();
- while(1)
- {
- for(PwmDuty=0;PwmDuty<500;PwmDuty++)
- {
- TIM_SetCompare1(TIM1,PwmDuty);
- delay_ms(5);
- }
- for(PwmDuty=500;PwmDuty>0;PwmDuty--)
- {
- TIM_SetCompare1(TIM1,PwmDuty);
- delay_ms(5);
- }
- }
- }
复制代码
4、实验现象。如前所述;
视频.mp4
(14.95 MB, 下载次数: 65)
三、实验总结。
这次实验时间过于匆忙,只是呈现了实验现象,而对于官方例程的学习理解还有很大的欠缺。接下来要好好利用这些例程,并结合手册深入理解学习。
此内容由EEWORLD论坛网友lising原创,如需转载或用于商业用途需征得作者同意并注明出处
|
|