阿雷啊 发表于 2017-8-2 21:35:21

STM32F0 如何输出非对称PWM波形

如题,STM32F0 如何输出非对称PWM波形。如何设置的? 请教高手。目前正在高单电阻电流采样的SVPWM控制。

samhong 发表于 2017-8-10 22:07:43

论谈里没有攻城狮称自己是高手!!哥。

无薪税绵 发表于 2017-10-17 10:23:11

本帖最后由 无薪税绵 于 2017-10-17 10:24 编辑

没有用过F0,网上搜索了一个,STM32f103c8的,不知道能不能参考一下。
(1)定时器通道的管脚是定下的,不能随意改动.我现在用的是STM32f103c8,其它的查相应手册.
详细配置如下:TIM1_CH1->PA8; TIM1_CH2->PA9; TIM1_CH3->PA10; TIM1_CH4->PA11;
             TIM2_CH1->PA0; TIM2_CH2->PA1; TIM2_CH3->PA2; TIM2_CH4->PA3;
             TIM3_CH1->PA6; TIM3_CH2->PA7; TIM3_CH3->PB0; TIM3_CH4->PB1;
             TIM4_CH1->PB6; TIM4_CH1->PB7; TIM4_CH1->PB8; TIM4_CH1->PB9;
(2)不是所有的芯片都有重映像功能的,STM32f103c8这四个定时器就不需要重映像.

(3)定时器输出需要设置向个模块:
   1)相应时钟要使能,包括TIMx,GPIO(用到哪个可以开哪个,初学者也可以全开起,免得多事;
   比如说:用TIM4
         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
      RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
      RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
2)GPIO相应管脚模式设置
         GPIO_InitTypeDef GPIO_InitStructure;
         GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9;
          GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
          GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
          GPIO_Init(GPIOB,&GPIO_InitStructure);
3)定时器设置(下面的例子是产生4个通道的PWM)
void TIM_Configuration(void)
{
TIM_TimeBaseInitTypeDef   TIM_TimeBaseStructure;
TIM_OCInitTypeDef            TIM_OCInitStructure;

TIM_DeInit(TIM4);

TIM_TimeBaseStructure.TIM_Period=144;               //ARR的值
TIM_TimeBaseStructure.TIM_Prescaler=4000;
TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1; //采样分频
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数模式
TIM_TimeBaseStructure.TIM_RepetitionCounter = 0x0;
TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);
TIM_ARRPreloadConfig(TIM4, ENABLE);//使能ARR预装载缓冲器

      /* Channel 1 Configuration in PWM mode */
      TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;                                 //PWM模式2
      TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;         //正向通道有效
      TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Disable;//反向通道无效
      TIM_OCInitStructure.TIM_Pulse = 120;                                                         //占空时间
      TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;               //输出极性
      TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;   //互补端的极性
      TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;
      TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;

      TIM_OC1Init(TIM4,&TIM_OCInitStructure);                                                 //通道1

      TIM_OCInitStructure.TIM_Pulse = 80;                                                         //占空时间
      TIM_OC2Init(TIM4,&TIM_OCInitStructure);                                                 //通道2

      TIM_OCInitStructure.TIM_Pulse = 40;                                                         //占空时间
      TIM_OC3Init(TIM4,&TIM_OCInitStructure);                                                 //通道3

      TIM_OCInitStructure.TIM_Pulse = 20;                                                         //占空时间
      TIM_OC4Init(TIM4,&TIM_OCInitStructure);                                                 //通道4
      

      /* TIM1 counter enable */
      TIM_Cmd(TIM4,ENABLE);
      
      /* TIM1 Main Output Enable */
      TIM_CtrlPWMOutputs(TIM4,ENABLE);

}

还有两篇文章:http://blog.csdn.net/wind4study/article/details/44994609
http://blog.sina.com.cn/s/blog_4ac1eaae0101funl.html



zhjb1 发表于 2017-10-17 16:07:26

用mbed工程实现过。很简单,只需要先将PWM周期固定后,输出的脉宽时间改变就可以实现任意的了。
页: [1]
查看完整版本: STM32F0 如何输出非对称PWM波形