找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1666|回复: 1
打印 上一主题 下一主题
收起左侧

STM32 pwm采集,与4路输出程序

[复制链接]
跳转到指定楼层
楼主
ID:622215 发表于 2019-10-11 11:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
pwm采集,与4路输出,不懂的就问

单片机源程序如下:
  1. #include "stm32f10x.h"
  2. #include "delay.h"
  3. #include "stm32f10x_tim.h"
  4. #include "Tim4ToTim1.h"
  5. #include "..\oled_spi\oled_spi.h"
  6. #include "..\oled_spi\bmp.h"
  7. #include "USART.h"

  8. //PWM波形输出与测量实例
  9. //TIM4-Ch1(PB6-9) 输出PWM波形到
  10. //Tim1-CH2(PA9)捕获

  11. void InitLED1()//PB8对应板上LED1灯
  12. {
  13.         GPIO_InitTypeDef GPIO_InitStructure;
  14.         RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB , ENABLE);        
  15.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
  16.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ;
  17.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz ;
  18.         GPIO_Init(GPIOB ,&GPIO_InitStructure) ;
  19. }

  20. uint32_t CntsforMs=0;
  21. uint32_t lastCntsforMs=0;
  22. void InitTimeCounter(void)//计时器
  23. {
  24.         TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
  25.         NVIC_InitTypeDef NVIC_InitStructure;
  26.        
  27.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);  ///使能TIM3时钟
  28.        
  29.   TIM_TimeBaseInitStructure.TIM_Period = 1000;         //自动重装载值
  30.         TIM_TimeBaseInitStructure.TIM_Prescaler=71;  //定时器分频:72Mhz/(71+1)=1Mhz
  31.         TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数模式
  32.         TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;
  33.        
  34.         TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);//初始化TIM3
  35.        
  36.         TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE); //允许定时器3更新中断
  37.         TIM_Cmd(TIM3,ENABLE); //使能定时器3
  38.        
  39.         NVIC_InitStructure.NVIC_IRQChannel=TIM3_IRQn; //定时器3中断
  40.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x01; //抢占优先级1
  41.         NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x03; //子优先级3
  42.         NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
  43.         NVIC_Init(&NVIC_InitStructure);
  44. }

  45. //定时器3中断服务函数
  46. void TIM3_IRQHandler(void)
  47. {
  48.         if(TIM_GetITStatus(TIM3,TIM_IT_Update)==SET) //溢出中断
  49.         {
  50.                 CntsforMs++;
  51.                 TIM_ClearITPendingBit(TIM3,TIM_IT_Update);  //清除中断标志位
  52.         }
  53. }


  54. uint32_t dT;
  55. char Line1[32],Line2[32],Line3[32],Line4[32],Line5[32],Line6[32],Line7[32];
  56. int main()
  57. {
  58.   int cnts=0;
  59.         int vol=3300;
  60.         char buf1[16],buf2[16],buf3[16],buf4[16];
  61.        
  62.         DelayInit(72);
  63.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);        //设置NVIC中断分组2:2位抢占优先级,2位响应优先级

  64. //        InitLED1();//PB8点亮LED1灯
  65.         InitTim4ToTim1();//PB6,7,8,9输出PWM波形,Tim1-CH1(PA8)捕获
  66.         InitTimeCounter();//只用TIM3来计时
  67.         uart1_init(9600);//PA9==Tx,PA10==Rx
  68.         //uart1_send("Test:ABCD",8);
  69.        
  70.         OLED_Init();//PA4,5,7;PB0,1
  71.         OLED_Display_On();
  72.         OLED_DrawBMP(0,0,128,64,BMP1);
  73.         DelayS(2);
  74.         OLED_Clear();

  75.         float heading=0.0;
  76.         while(1)
  77.         {
  78.                 uart1_send("1", 1);
  79.                 cnts++;
  80.                 dT =        CntsforMs-lastCntsforMs;
  81.           lastCntsforMs = CntsforMs;
  82.                 sprintf(Line1, "T=%dS,dT=%02dms", CntsforMs/1000,dT);

  83.           TIM4->CCR3 = 20000-(cnts%2000)*10; //TIM4-Ch3(PB8) 输出PWM波形到
  84.                        
  85.                 sprintf(Line2, "%dUs/%dus", PWM_Width*MinPwmWidth,PWM_Period*MinPwmWidth);//PWM波形宽度/PWM波形周期
  86.                 sprintf(Line3, "%.2f%s", PWM_Width*100.0/(float)PWM_Period,"%");//PWM波形占空比
  87.                
  88.                 OLED__ShowStr(0,0,(u8*)Line1,2);
  89.                 OLED__ShowStr(0,2,(u8*)Line2,2);
  90.                 OLED__ShowStr(0,4,(u8*)Line3,2);
  91.                 if (USART1_RxState&0x8000)
  92.                         {
  93.                         USART1_RxState = 0;
  94.                         heading = (USART1_RxBuf[2]-0x30)*100.0+(USART1_RxBuf[3]-0x30)*10.0;
  95.                         heading        += (USART1_RxBuf[4]-0x30)*1.0+(USART1_RxBuf[5]-0x30)*0.1;
  96.                         sprintf(Line4, "Head = %.1f", heading);//
  97.                         }
  98.                 OLED__ShowStr(0,6,(u8*)Line4,2);
  99. //                DelayMs(100);
  100.   }
  101. }




  102.             

  103. /*********************************************END OF FILE**********************/
复制代码

所有资料51hei提供下载:
TestStm32F103C8(中景园核心板+OLED+USART1+Tim4输出PWM波形由Tim1测量实例+Tim3计时).7z (48.34 KB, 下载次数: 9)



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1 发表于 2019-10-11 17:22 | 只看该作者
本帖需要重新编辑补全电路原理图,源码,详细说明与图片即可获得100+黑币(帖子下方有编辑按钮)
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表