久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1948|回復: 2
打印 上一主題 下一主題
收起左側

stm32 PID 脈寬調制程序

[復制鏈接]
跳轉到指定樓層
樓主
ID:222531 發表于 2018-10-4 16:30 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
通過檢測電流電壓的大小,改變斬波電路的PWM信號的脈寬,以實現穩壓目的。


單片機源程序如下:
  1. #include "PID.h"

  2. u8 m=0;
  3. u16 adn=0;
  4. char b[20];

  5. typedef struct PID
  6. {
  7. int SetPoint;
  8. float Kp;
  9. float Ki;
  10. float Kd;
  11. int NowError;  //當前誤差
  12. int LastError; //上次誤差
  13. int PrevError; //上上次誤差
  14. double OUT;
  15. }PID;

  16. static PID sPID;
  17. static PID *sptr = &sPID;

  18. void PID_Init(void)
  19. {
  20.         sptr->NowError = 0;
  21.   sptr->LastError = 0;
  22.   sptr->PrevError = 0;
  23.   sptr->Kp = 2;
  24.   sptr->Ki= 0;
  25.   sptr->Kd = 0;
  26.   sptr->SetPoint = 1241;   //1241/4096*3.3=1V
  27.         sptr->OUT = 0;
  28. }

  29. int        PIDCal(u16 actually)
  30. {
  31.         register int ep,ei,ed,zout;
  32.   sptr->NowError = sptr->SetPoint - actually;   //設定值-實際值
  33.         ep = sptr->NowError - sptr->LastError;
  34.         ei = sptr->NowError;
  35.         ed = sptr->NowError - 2*sptr->LastError + sptr->PrevError;
  36.   zout = sptr->Kp * ep + sptr->Ki * ei + sptr->Kd * ed;
  37.         sptr->OUT+=zout;
  38.   sptr->PrevError = sptr->LastError;
  39.   sptr->LastError = sptr->NowError;
  40.         if(sptr->OUT<360) sptr->OUT=360;
  41.         if(sptr->OUT>3240) sptr->OUT=3240;
  42.   return(sptr->OUT);
  43. }

  44. void TIM2_init()
  45. {
  46.         TIM_TimeBaseInitTypeDef  TIM_TimeBaseInitStruct;
  47.   NVIC_InitTypeDef  NVIC_InitStruct;
  48.        
  49.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
  50.        
  51.         TIM_TimeBaseInitStruct.TIM_Period = 4999;
  52.         TIM_TimeBaseInitStruct.TIM_Prescaler = 71;
  53.         TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;
  54.         TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;
  55.         TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStruct);
  56.        
  57.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
  58.         NVIC_InitStruct.NVIC_IRQChannel = TIM2_IRQn;
  59.         NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
  60.         NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0;
  61.         NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0;
  62.         NVIC_Init(&NVIC_InitStruct);
  63.        
  64.         TIM_ClearFlag(TIM2,TIM_FLAG_Update);
  65.         TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);
  66.        
  67.         TIM_Cmd(TIM2,ENABLE);
  68. }

  69. void TIM2_IRQHandler()
  70. {
  71.         u16 adv;
  72.         if(TIM_GetITStatus(TIM2,TIM_IT_Update)!=RESET)
  73.         {
  74.                 TIM_ClearITPendingBit(TIM2,TIM_FLAG_Update);
  75.                 if(m<3)
  76.                 {
  77.                         adn+=AD_read();
  78.                         m++;
  79.                 }
  80.                 else
  81.                 {
  82.                         adv=adn/4;
  83.                         TIM3->CCR1 = PIDCal(adv);
  84.                         adn=0;m=0;
  85.                 }
  86.         }
  87. }
復制代碼
  1. #include "PWM.h"

  2. void PWM_init(u16 a,u16 b)
  3. {
  4.         GPIO_InitTypeDef  GPIO_InitStruct;
  5.         TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
  6.         TIM_OCInitTypeDef  TIM_OCInitStructure;
  7.        
  8.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
  9.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO,ENABLE);
  10.        
  11.         GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6;
  12.         GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP ;
  13.         GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
  14.         GPIO_Init(GPIOA,&GPIO_InitStruct);
  15.        
  16.         TIM_TimeBaseInitStruct.TIM_Period = a;
  17.         TIM_TimeBaseInitStruct.TIM_Prescaler = b;
  18.         TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;
  19.         TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;
  20.         TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStruct);
  21.        
  22.         TIM_OCInitStructure.TIM_Pulse = 1799;
  23.         TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //選擇定時器模式:TIM脈沖寬度調制模式2
  24.         TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比較輸出使能
  25.         TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //輸出極性:TIM輸出比較極性高
  26.         TIM_OC1Init(TIM3, &TIM_OCInitStructure);  //根據T指定的參數初始化外設TIM3 OC2

  27.         TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);  //使能TIM3在CCR2上的預裝載寄存器
  28.        
  29.         TIM_Cmd(TIM3,ENABLE);
  30. }
復制代碼

所有資料51hei提供下載:
STM32PWM.rar (389.88 KB, 下載次數: 53)



分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:1 發表于 2018-10-6 22:17 | 只看該作者
補全原理圖或者詳細說明一下電路連接即可獲得100+黑幣
回復

使用道具 舉報

板凳
ID:185611 發表于 2019-7-21 15:12 | 只看該作者
實際中這個程序工作正常嗎
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 一区二区在线 | 91欧美| 精品久久亚洲 | 日日日操 | 精品毛片在线观看 | 一区二区三区在线 | 免费黄色日本 | 久草网址 | 国产99久久精品一区二区永久免费 | 99精品欧美一区二区三区综合在线 | 国产日韩一区二区 | 亚洲国产一区二区三区在线观看 | 亚洲第一网站 | 亚洲第一天堂无码专区 | 天天爽夜夜爽精品视频婷婷 | 99久久99| 国产精品日女人 | www.久久久.com | 涩爱av一区二区三区 | 91精品国产综合久久久久蜜臀 | 在线视频一区二区 | 日韩精品免费在线观看 | 国产一级淫片a直接免费看 免费a网站 | 激情一区二区三区 | 亚洲欧洲在线视频 | 久久99精品视频 | 日韩乱码一二三 | 黄网站色大毛片 | 久久亚洲国产 | 国产精品成人在线播放 | 免费一区二区三区 | 日韩中文一区 | 天堂一区二区三区 | 在线观看亚| 成人永久免费视频 | 成人性视频免费网站 | 国产激情精品 | 韩日视频在线观看 | 久久久精品网站 | 超碰免费在线 | 中文字幕在线一区 |