4752|1

58

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

【雅特力开发板 AT32F421 测评】定时器PWM输出 [复制链接]

  本帖最后由 eew_Violet 于 2021-4-28 00:34 编辑

        有些地方需要输出有一定相位差的PWM,对于没有异步PWM的片子,这个时候可以利用定时器的PWM1和PWM2模式实现,像这种.

        最大占空比一般不超48%,否则会炸管,我已经搞废两个D209L了.接下来我们看下具体如何实现.TIM初始化代码依旧放在了at32_board.c中.

/*TIM1初始化*/
void TIM_Init()
{
	TMR_TimerBaseInitType           TIM_TimerBaseStructure;
    TMR_OCInitType  				TMR_OCInitStructure;
    GPIO_InitType 					GPIO_InitStructure;
	
	/* 启用 TIM clock 和 GPIO 时钟  */
  RCC_APB2PeriphClockCmd(AT32_TIM_FUNC , ENABLE);
  RCC_AHBPeriphClockCmd(AT32_TIM_GPIO_RCC , ENABLE);
	

  /* Configure tim_pins: CH1   CH4
	 *	CH1-->PA8
	 *	CH4-->PA11
	 */
  //GPIO初始化
  GPIO_StructInit(&GPIO_InitStructure);
  GPIO_InitStructure.GPIO_Pins = AT32_TIM_CH1_PIN|AT32_TIM_CH4_PIN ;
  GPIO_InitStructure.GPIO_MaxSpeed = GPIO_MaxSpeed_50MHz;
  GPIO_InitStructure.GPIO_OutType = GPIO_OutType_PP; 
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_Pull = GPIO_Pull_NOPULL;
  GPIO_Init(AT32_TIM_GPIO, &GPIO_InitStructure);
	//GPIO复用到定时器
  GPIO_PinAFConfig(AT32_TIM_GPIO, GPIO_PinsSource8, GPIO_AF_2);
  GPIO_PinAFConfig(AT32_TIM_GPIO, GPIO_PinsSource11, GPIO_AF_2);
	
  /* 定时器时基配置 为了便于观察先频率调的低些--------------------------------------*/
  TMR_TimeBaseStructInit(&TIM_TimerBaseStructure);
  TIM_TimerBaseStructure.TMR_Period = 65535-1;
  TIM_TimerBaseStructure.TMR_DIV = 6553-1;
  TIM_TimerBaseStructure.TMR_ClockDivision = TMR_CKD_DIV2;
  TIM_TimerBaseStructure.TMR_CounterMode = TMR_CounterDIR_CenterAligned1;

  TMR_TimeBaseInit(AT32_TIM, &TIM_TimerBaseStructure);
	
  /* PWM模式配置: Channe8 */
  TMR_OCStructInit(&TMR_OCInitStructure);
  TMR_OCInitStructure.TMR_OCMode = TMR_OCMode_PWM1;
  TMR_OCInitStructure.TMR_OutputState = TMR_OutputState_Enable;
  TMR_OCInitStructure.TMR_Pulse = 0;
  TMR_OCInitStructure.TMR_OCPolarity = TMR_OCPolarity_High;
  TMR_OCInitStructure.TMR_OCIdleState = TMR_OCIdleState_Reset ;

  TMR_OC1Init(AT32_TIM, &TMR_OCInitStructure);

  TMR_OC1PreloadConfig(AT32_TIM, TMR_OCPreload_Enable);

  /* PWM2模式配置: Channe11 */
  TMR_OCInitStructure.TMR_OCMode = TMR_OCMode_PWM2;
  TMR_OCInitStructure.TMR_OutputState = TMR_OutputState_Enable;
  TMR_OCInitStructure.TMR_Pulse = 0;

  TMR_OC4Init(AT32_TIM, &TMR_OCInitStructure);

  TMR_OC4PreloadConfig(AT32_TIM, TMR_OCPreload_Enable);
	//使能定时器
	TMR_Cmd(AT32_TIM,ENABLE);
    //使能输出
	TMR_CtrlPWMOutputs(TMR1, ENABLE);
}

        为了便于移植在at32_board.h中宏定义

/**************** TIM ****************/
#define AT32_TIM               	   TMR1

#define AT32_TIM_GPIO_RCC    	   RCC_AHBPERIPH_GPIOA
#define AT32_TIM_FUNC  			   RCC_APB2PERIPH_TMR1

/*TIM1_CH1*/
#define AT32_TIM_CH1_PIN           GPIO_Pins_8
#define AT32_TIM_GPIO              GPIOA

/*TIM1_CH4*/
#define AT32_TIM_CH4_PIN           GPIO_Pins_11
#define AT32_TIM_GPIO              GPIOA

/**************** End TIM****************/

        通道2和通道3让串口给占了,所以这里就用通道1和通道4了

        在board.c中调用初始化函数完成初始化.

void rt_hw_board_init()
{
    /* System Clock Update */
    SystemCoreClockUpdate();
    
    /* System Tick Configuration */
    _SysTick_Config(SystemCoreClock / RT_TICK_PER_SECOND);
	
	  /* 串口1初始化*/
	  UART_Print_Init(115200);
	  /* SPI2初始化 */
	  SPI2_Init();

	  OLED_Init();
	  TIM_Init();
	
    /* Call components board initial (use INIT_BOARD_EXPORT()) */
#ifdef RT_USING_COMPONENTS_INIT
    rt_components_board_init();
#endif

#if defined(RT_USING_USER_MAIN) && defined(RT_USING_HEAP)
    rt_system_heap_init(rt_heap_begin_get(), rt_heap_end_get());
#endif
}

        while(1)中写好测试代码

           每100毫秒对比较寄存器自增一次,改变占空比,然后OLED获取并显示比较寄存器的值.

uint16_t Pulse;
uint8_t  dir = 1;

 while (1)
  {

		if(dir == 1)
			Pulse++;
		if(Pulse>31456)
			dir = 0;
			
		if(dir == 0)
			Pulse--;
		if(Pulse==0)
			dir = 1;
        //设置比较寄存器
		TMR_SetCompare1(AT32_TIM, Pulse);
		TMR_SetCompare4(AT32_TIM, 65535-Pulse);
		OLED打印寄存器值
		OLED_ShowString(5,0,(uint8_t*)"CC1",16);
		OLED_ShowNum(5,16,TMR_GetCapture1(AT32_TIM),5,16);
		OLED_ShowString(5,30,(uint8_t*)"CC4",16);
		OLED_ShowNum(5,46,TMR_GetCapture4(AT32_TIM),5,16);
		OLED_Refresh();
		rt_thread_mdelay(100);
  }

WeChat_20210428000856.mp4 (1.77 MB, 下载次数: 4)

这是占空比比较小的时候

WeChat_20210428002619.mp4 (2.32 MB, 下载次数: 2)

这是占空比比较大的时候,刚才蓝色绿色可能不太容易看出来,这次换个色.

        可以看到代码已成功运行

最新回复

[attach]536177[/attach]看到绿灯亮的还可以   详情 回复 发表于 2021-4-29 21:59
点赞 关注
 
 

回复
举报

1704

帖子

0

TA的资源

五彩晶圆(初级)

沙发
 

看到绿灯亮的还可以

 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表