痞酷網_PIGOO

 找回密碼
 立即註冊
!!! [系統偵測到廣告阻擋軟體] !!!

如果您覺得痞酷網對您有些許幫助,或者您認同痞酷網的理想,

那麼希望您將痞酷網設定為白名單.

並請在上論壇的時候,動動您的手指,用行動支持我們.

謝謝!
樓主: antlu

求助:雕刻機馬達PWM驅動電路之後續問題

[複製鏈接]
 樓主| 發表於 2016-6-27 00:39:45 | 顯示全部樓層
xiaolaba 發表於 2016-6-26 11:45 PM
不要控制, 只有馬達直接接到電源, 能正常啟動馬達, 也順利運轉的話, 表示容量足夠應付啟動電流
如果不行, ...

xiaolaba大:
   PC電源供應我直接加上去就跳掉,上一個馬達不會跳(內阻比較大)!!
   目前我的PWM電路可以用 線性電源供應器控制,但是 PC電供還是不行!!
發表於 2016-6-27 00:55:59 | 顯示全部樓層
加個電阻 之後再用繼電器PASS
 樓主| 發表於 2016-6-27 13:34:05 | 顯示全部樓層
專炸元件 發表於 2016-6-27 12:55 AM
加個電阻 之後再用繼電器PASS

專炸元件大:
      電源供應部份要下手,加裝繼電器也是不錯的辦法!! 感謝!!
      目前還有一個現象是PWM的 % 對應轉速的問題,因為 PWM變化會造成電壓變化,直流馬達轉動之後內部反電動勢會減少電流量於是會造成馬達兩端的電壓上升轉速變快...這不知道如何解決?
發表於 2016-6-27 15:01:24 | 顯示全部樓層
本文章最後由 scottwang 於 2016-6-27 06:05 PM 編輯

阿乾大,您的問題,我想了再想,問題可能出在SW Power 瞬間電流不足造成的,您可以在12伏特兩端並聯一個4700uF/25V以上的電容器看看,就是利用電容預先儲能,若是4700uF/25V仍不足,再往上增加,你另外的問題,我在想可能要用整流的方式,但是要提高輸入電壓為12V+1.4V,或者找大電流的蕭特基二極體,以下的電路,有興趣可以試試.

ArduinoMiniPro電壓調整器_Antlu_ScottWang.gif
發表於 2016-6-27 18:51:02 | 顯示全部樓層
antlu 發表於 2016-6-27 01:34 PM
專炸元件大:
      電源供應部份要下手,加裝繼電器也是不錯的辦法!! 感謝!!
      目前還有一個現象是PWM ...

馬達空載當然轉速會高
 樓主| 發表於 2016-6-27 21:05:23 | 顯示全部樓層
scottwang 發表於 2016-6-27 03:01 PM
阿乾大,您的問題,我想了再想,問題可能出在SW Power 瞬間電流不足造成的,您可以在12伏特兩端並聯一個4700uF/ ...

scottwang大:
   現在是開機瞬間電流過大而跳保護,加上電容器應該會更大的瞬間電流吧!!
發表於 2016-6-27 21:15:27 | 顯示全部樓層
本文章最後由 scottwang 於 2016-6-27 09:27 PM 編輯
antlu 發表於 2016-6-27 09:05 PM
scottwang大:
   現在是開機瞬間電流過大而跳保護,加上電容器應該會更大的瞬間電流吧!! ...


那加LC就有舒緩的作用了,可是也要注意若是電流阻檔太多就會不足了.
PC Power與馬達同時開,或者開機順序如何?
開機瞬間要讓馬達不加電,也就是延遲作用,延遲上電.
 樓主| 發表於 2016-6-27 21:35:32 | 顯示全部樓層
scottwang 發表於 2016-6-27 09:15 PM
那加LC就有舒緩的作用了,可是也要注意若是電流阻檔太多就會不足了.
PC Power與馬達同時開,或者開機順序如 ...

SCOTTWANG大:
   您可能誤會了!!  我的馬達電源是獨立使用12V電源,這個12V電源因為4.5A電源不夠會跳保護,所以我使用 外加一個PC電源(我把 5V -5V 3.3V...接線都去掉了,剩下 12V 應該是 25A吧!) 給我的雕刻機主軸馬達12V使用. 現在,這個PC電供改裝的主軸馬達電源一通電給12V主軸馬達就跳電,所以我才想要外接一個 PWM電路 串在 12V電源(PC改裝的電供)和 12V馬達中間,以避免 PC改裝的主軸馬達電供跳保護!!
發表於 2016-6-27 21:48:44 | 顯示全部樓層
antlu 發表於 2016-6-27 09:35 PM
SCOTTWANG大:
   您可能誤會了!!  我的馬達電源是獨立使用12V電源,這個12V電源因為4.5A電源不夠會跳保護, ...

那如果先不加PWM,直接在PC Power加上大電容再供電給馬達使用呢?
若4700uF/25V電容仍不足,再往上加.
發表於 2016-6-28 17:18:40 | 顯示全部樓層
antlu 發表於 2016-6-27 12:39 AM
xiaolaba大:
   PC電源供應我直接加上去就跳掉,上一個馬達不會跳(內阻比較大)!!
   目前我的PWM電路可以 ...

你那個電源不行, 換一台試試看
先要加電阻, 限制啟動電流, 比較扭力大的馬達不是玩具級的就要注意
 樓主| 發表於 2016-6-28 21:14:34 | 顯示全部樓層
xiaolaba 發表於 2016-6-28 05:18 PM
你那個電源不行, 換一台試試看
先要加電阻, 限制啟動電流, 比較扭力大的馬達不是玩具級的就要注意 ...

感謝XIAOLABA SCOTTWANG 專炸元件 ..等先進們的指導,目前終於有所突破..

線路圖如下:
   pwm2motorV3.jpg
增加了DRC 消除雜訊,7805前方加了 450uH電感,12V輸入電容器改為 2200/16 ,LGC12002以及 MCU 都加了 104的旁路電容... 程式最小啟動% 因為不同馬達設為 24% 約2V左右...

電源ON時先把 PWM設為 24%+基準20% 啟動馬達2秒 然後做 A/D轉換讀取 VR的設定值 0~5V 0~1024 0~100% (目前100%約為10V) 再顯示VR值,開始 從 24%加速到 VR的%數 以5ms一個STEP 加速到達設定值為止...目前移動平均數的程式(DIGITAL FILTER)尚未修改!!

新版 舊版比較
調整大小IMG_20160628_194748.jpg

因為新版增加了許多零件造成範圍過大,雕刻機限未開關觸發(當機)所以需多地方沒刻到,臨時跳線跳零件..
調整大小IMG_20160628_194757.jpg

調整大小IMG_20160628_194812.jpg

調整大小IMG_20160628_194828.jpg

調速狀況還不錯,反應比較慢些!!
調整大小IMG_20160628_194354.jpg

調整大小IMG_20160628_194403.jpg

調整大小IMG_20160628_194419.jpg

調整大小IMG_20160628_194428.jpg

目前使用 PC的電源供應12V 沒有跳保護!!

評分

5

查看全部評分

發表於 2016-6-29 10:48:55 | 顯示全部樓層
本文章最後由 xiaolaba 於 2016-6-29 10:50 AM 編輯
antlu 發表於 2016-6-28 09:14 PM
感謝XIAOLABA SCOTTWANG 專炸元件 ..等先進們的指導,目前終於有所突破..

線路圖如下:


恭喜恭喜
成了高手了
請問白色7-SEG LED哪裡買的
有要代工刻PCB嗎
 樓主| 發表於 2016-6-29 10:59:07 | 顯示全部樓層
xiaolaba 發表於 2016-6-29 10:48 AM
恭喜恭喜
成了高手了
請問白色7-SEG LED哪裡買的

xiaolaba大:
    白色7段LED我有賣,我說過 我可以贈送幫助我的人,少量免費贈送,量多再議!!
    10個夠嗎? 代工刻PCB沒有ㄟ!! 因為費工且鄰居虎伺耽耽要抓我噪音的把柄...你買一台雕刻機,小弟我"手把手"教你基本用法和一些經驗!!
發表於 2016-6-29 13:40:18 | 顯示全部樓層
本文章最後由 scottwang 於 2016-6-29 01:41 PM 編輯

雖然問題有解決了,可喜可賀,不過個人還是習慣性要抓出真正的問題點,而不是把有可能的通通加上,這樣會被變大胖子,體積和零件就加大加多了,要抓出問題點就要一點一點測,直到找到問題點所在,有時候是兩個地方造成的.就要改兩個地方.
 樓主| 發表於 2016-6-29 21:47:03 | 顯示全部樓層
scottwang 發表於 2016-6-29 01:40 PM
雖然問題有解決了,可喜可賀,不過個人還是習慣性要抓出真正的問題點,而不是把有可能的通通加上,這樣會被變大 ...

scottwang 大:
   感謝建議,馬達驅動真的不容易,我慢慢努力...
發表於 2016-6-29 22:17:57 | 顯示全部樓層
antlu 發表於 2016-6-29 10:59 AM
xiaolaba大:
    白色7段LED我有賣,我說過 我可以贈送幫助我的人,少量免費贈送,量多再議!!
    10個夠嗎? ...

呂大 這個電路板大約5cm x 5cm
這次想改用8字LED, MCU不變, 用74LS164擴IO.
可是還沒開始改設計, 就是飛線焊接太花時間了

改用8字LED

改用8字LED

改用8字LED

改用8字LED
neo_img_img_1655.jpg
 樓主| 發表於 2016-6-29 23:00:41 | 顯示全部樓層
本文章最後由 antlu 於 2016-6-29 11:11 PM 編輯
xiaolaba 發表於 2016-6-29 10:17 PM
呂大 這個電路板大約5cm x 5cm
這次想改用8字LED, MCU不變, 用74LS164擴IO.
可是還沒開始改設計, 就是飛 ...


X大:
   我的 LGC12002 信號線3條若是串顯則是4條 DI DO CLK STB  V+ GND 你要用8個字就使用2個,我先前的溫度計時鐘 或是 溫溼度計 8個字 沒使用 DO 所以信號線共使用 DI CLK STB1 STB2 ,它有LATCH功能,所以算好用,不會佔用太多MCU掃描時間.. 板子你LAY 好之後再傳給我看看,我只用單面板!! 數量多還是使用洗板比較快!!


PWM2MOTORV5JPG.jpg
發表於 2016-6-30 21:50:19 來自手機 | 顯示全部樓層
antlu 發表於 2016-6-29 11:00 PM
X大:
   我的 LGC12002 信號線3條若是串顯則是4條 DI DO CLK STB  V+ GND 你要用8個字就使用2個,我先前的 ...

Lu大 找了一下lg12002的資料
請問3.6v時還會正常工作嗎
初步看了它只吃5v
設計用一節鋰電池供電不知道行不
可能誤會了 看你的LED就4個8字一組
esr是夠了 可以顯示9999或99.99 量程有夠大 不需要串兩個
 樓主| 發表於 2016-7-1 00:20:43 | 顯示全部樓層
xiaolaba 發表於 2016-6-30 09:50 PM
Lu大 找了一下lg12002的資料
請問3.6v時還會正常工作嗎
初步看了它只吃5v

X大:
   能不能用在 3.3V我沒試過ㄟ!! 我都使用 5V ..
 樓主| 發表於 2016-7-1 00:21:51 | 顯示全部樓層
今天又改了一下程式應該可以分享了!!
  1. //-------20160622 VV--------------------- 非常重要使用中斷 TIM4  main.c 最後要加一些宣告!!
  2. //----20160630 修改啟動程序 先顯示後驅動
  3. #include "stm8s.h"
  4. #include "stm8s_tim1.h"
  5. #include "stm8s_tim4.h"
  6. #include "stm8s_clk.h"
  7. #include "stm8s_delay.h"
  8. #include "stm8s_adc1.h"
  9. //#include "stm8s_itc.h"
  10. #define VR_Channel ADC1_CHANNEL_0// stm8s103k3 pin 16
  11. #define LG12002PORT GPIOC//GPIOC
  12. #define DIN GPIO_PIN_7  //new PIN_4 old version PIN_1
  13. #define Clk GPIO_PIN_6  //new PIN_3 old version PIN_2
  14. #define STB GPIO_PIN_5  //new PIN_1 old version PIN_4
  15. #define Motor_port GPIOC
  16. #define Motor_out GPIO_PIN_1  //PC1 pwm motor driver
  17. u8 a,b,c,d;
  18. u16 VR_data =0;
  19. u8 AD_read_count;//0~3 輪流read out AD count
  20. u8 adc_update_flag;//ADC 更新1次的旗標
  21. u16 pwmwidth = 1;
  22. u16 ADCValue[13]={0};//電壓值平均用減少誤差雜訊
  23. u16 DataADC=0;//最後的電壓值
  24. u8 display_2table[20]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};
  25. u16 prev_VR_data;//previous VR data
  26. u8 inc_flag;//prev_VR_data < VR_data
  27. u16 dif_PWM;//prev_VR_data - VR_data
  28. u16 motor_base = 200;//motor PWM base
  29. u16 ADCtemp=0;
  30. u8 display_time;
  31. void GPIOinit(void)
  32. {
  33.         GPIO_Init(Motor_port,Motor_out,GPIO_MODE_OUT_PP_HIGH_FAST);//motor drive
  34.         GPIO_Init(LG12002PORT,DIN|STB|Clk,GPIO_MODE_OUT_PP_HIGH_FAST);//for pt6961 driver
  35. }

  36. void tim4init(void)
  37. {
  38.         TIM4_TimeBaseInit(TIM4_PRESCALER_32,250);//4.05ms TIM4_PRESCALER_32
  39.         TIM4_SetCounter(250);
  40.         TIM4_ITConfig(TIM4_IT_UPDATE,ENABLE);//2Mhz/32/250=4ms
  41.         TIM4_Cmd(ENABLE);
  42. }



  43. void Delay_us(u16 ust)//uS Delay
  44. {
  45.         while(ust !=0)
  46.         {
  47.                 ust--;
  48.         }
  49. }

  50. void DelayMs(u16 mst)//mS delay
  51. {
  52.         while( mst !=0)
  53.         {
  54.                 Delay_us(400);
  55.                 mst--;
  56.         }
  57. }

  58. void Send6961_Data(u8 Dat)
  59. {
  60.           u8 i;
  61.         GPIO_WriteLow(LG12002PORT,STB);
  62.       
  63.                  for (i=0;i<8;i++)
  64.                  {
  65.                           if((Dat & 0x01)!=0)// SER=Dat & 0x80;
  66.                 {
  67.                  GPIO_WriteHigh(LG12002PORT,DIN);
  68.                   }
  69.                 else
  70.                 {
  71.                 GPIO_WriteLow(LG12002PORT,DIN);
  72.                 }
  73.                   Dat>>=1;
  74.                   GPIO_WriteLow(LG12002PORT,Clk);//  GPIO_WriteLow(LEDPORT,Clk);
  75.                   GPIO_WriteHigh(LG12002PORT,Clk);
  76.                  }       
  77.         GPIO_WriteLow(LG12002PORT,STB);  
  78. }

  79. /*
  80.    20141116 send command byte
  81. */

  82. void Send6961_Cmd(u8 Dat)
  83. {
  84.   u8 i;
  85.     GPIO_WriteHigh(LG12002PORT,STB);
  86.    GPIO_WriteLow(LG12002PORT,STB);
  87.       
  88.      for (i=0;i<8;i++)
  89.          {
  90.           if((Dat & 0x01)!=0)// SER=Dat & 0x80;
  91.         {
  92.          GPIO_WriteHigh(LG12002PORT,DIN);
  93.           }
  94.         else
  95.         {
  96.         GPIO_WriteLow(LG12002PORT,DIN);
  97.         }
  98.           Dat>>=1;
  99.           GPIO_WriteLow(LG12002PORT,Clk);// Clk=0;
  100.           GPIO_WriteHigh(LG12002PORT,Clk);
  101.          }
  102.         GPIO_WriteHigh(LG12002PORT,STB);
  103. }

  104. void PT6961_Init(void) // 8bit mode
  105. {
  106.         DelayMs(200);
  107.         Send6961_Cmd(0x40);//CMD 2 fix address normal mode
  108.         Send6961_Cmd(0xc0);//CMD 3 address=0
  109.         Send6961_Data(0x0);
  110.         Send6961_Data(0x00);
  111.         Send6961_Data(0x00);
  112.         Send6961_Data(0x00);       
  113.         Send6961_Cmd(0x02);//CMD 1 6digit 12segment
  114.         Send6961_Cmd(0x89);//CMD 4 display control bright 14/16
  115.         DelayMs(1);       
  116. }


  117. void LGC12002_display(void)
  118. {
  119. Send6961_Cmd(0x40);//CMD 2 fix address normal mode
  120. Send6961_Cmd(0xc0);//CMD 3 address=0
  121. Send6961_Data(0xf0);//空白
  122. Send6961_Data(display_2table[a]);//5
  123. Send6961_Data(0xf0);//空白
  124. Send6961_Data(display_2table[b]);//5
  125. Send6961_Data(0xf0);//空白
  126. Send6961_Data(display_2table[c]);//2
  127. Send6961_Data(0xf0);//空白
  128. Send6961_Data(display_2table[d]);//4
  129. Send6961_Cmd(0x02);//CMD 1 6digit 12segment
  130. Send6961_Cmd(0x89);//CMD 4 display control bright 14/16                       
  131. DelayMs(1);       
  132. }

  133. void TransData(void)// VR_data>> a b c d
  134. {
  135.         u16 result;
  136.         result = VR_data;
  137.          if (result >= 1000)
  138.    {
  139.           a=1;b=0;c=0;d=0;
  140.    }
  141.         else
  142.    {
  143.           a=0;
  144.           b= result/100;
  145.           c= (result%100)/10;
  146.           d= result %10;
  147.    }
  148. }



  149. //-------20160622 ^^----------------
  150. void ADConvert(void)//轉換類比信號成為數位信號
  151. {
  152.         unsigned char ADCcount =0;
  153.         ADC1->CR1|=0x02;
  154.         ADC1_StartConversion();
  155.         while(ADCcount<13)//10>>13
  156.         {
  157.                 while(ADC1_GetFlagStatus(ADC1_FLAG_EOC)==RESET);
  158.                 ADC1_ClearFlag(ADC1_FLAG_AWS0);
  159.                 ADCValue[ADCcount]=ADC1_GetConversionValue();
  160.                 ADCcount++;
  161.         }
  162.         ADC1->CR1 &= ~0x02;
  163. }

  164. //------ newADCfilter with digital filter 2016 0630

  165. void newDigitalFiltering(void)//把類比信號的10組資料作中間的6組平均
  166. {       
  167.         u8 i=0;
  168.         ADCtemp=0;
  169.   for(i=0; i<13;i++)
  170.         {
  171.                 ADCtemp = ADCtemp-(ADCtemp/4)+ADCValue[i];
  172.                 DataADC = (ADCtemp/4);
  173.          }
  174. }






  175. void DigitalFiltering(void)//把類比信號的10組資料作中間的6組平均
  176. {
  177.         unsigned char i,j;
  178.         unsigned char cptemp;       
  179.         for(i=10;i>=1;i--)
  180.         {
  181.                 for(j-0;j<(i-1);j++)
  182.                 {
  183.                         if(ADCValue[j]>ADCValue[j+1])
  184.                         {
  185.                                 cptemp=ADCValue[j];
  186.                                 ADCValue[j]=ADCValue[j+1];
  187.                                 ADCValue[j+1]=cptemp;
  188.                         }
  189.                 }
  190.         }
  191.         DataADC=0;
  192.         for(i=2;i<=7;i++)
  193.         {
  194.                 DataADC +=ADCValue[i];
  195.         }
  196.         DataADC /=6;       
  197. }



  198. unsigned int ADC1Set(ADC1_Channel_TypeDef ADC_Channel)//讀取不同的AD通道經過類比轉成數位再經過10取6平均送出結果
  199. {
  200. u16 ADresult;
  201. {
  202. ADC1_Init(ADC1_CONVERSIONMODE_CONTINUOUS,ADC_Channel,ADC1_PRESSEL_FCPU_D2,ADC1_EXTTRIG_TIM,DISABLE,ADC1_ALIGN_RIGHT,ADC1_SCHMITTTRIG_CHANNEL0,DISABLE);
  203. ADConvert();
  204. newDigitalFiltering();
  205. //DigitalFiltering();
  206. ADresult=DataADC;
  207. DataADC=0;
  208. adc_update_flag=0;
  209. }
  210. return ADresult;
  211. }



  212. void update_TIM1_Config(u8 sw)
  213. {
  214.         switch(sw)
  215.         {
  216.         case 0:
  217.                 TIM1_OC1Init(TIM1_OCMODE_PWM2,TIM1_OUTPUTSTATE_ENABLE,TIM1_OUTPUTNSTATE_ENABLE,(pwmwidth+motor_base),TIM1_OCPOLARITY_LOW,TIM1_OCNPOLARITY_HIGH,TIM1_OCIDLESTATE_SET,TIM1_OCNIDLESTATE_RESET);
  218.         break;

  219.         case 1:
  220.                 TIM1_OC2Init(TIM1_OCMODE_PWM2,TIM1_OUTPUTSTATE_ENABLE,TIM1_OUTPUTNSTATE_ENABLE,pwmwidth,TIM1_OCPOLARITY_LOW,TIM1_OCNPOLARITY_HIGH,TIM1_OCIDLESTATE_SET,TIM1_OCNIDLESTATE_RESET);
  221.         break;

  222.         case 2:
  223.                 TIM1_OC3Init(TIM1_OCMODE_PWM2,TIM1_OUTPUTSTATE_ENABLE,TIM1_OUTPUTNSTATE_ENABLE,pwmwidth+20,TIM1_OCPOLARITY_LOW,TIM1_OCNPOLARITY_HIGH,TIM1_OCIDLESTATE_SET,TIM1_OCNIDLESTATE_RESET);
  224.         break;
  225.         }
  226.         TIM1_Cmd(ENABLE);
  227.         TIM1_CtrlPWMOutputs(ENABLE);
  228. }

  229. void CLK_Config(void)
  230. {
  231.         CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV8);
  232. }

  233. void tim4svc(void)
  234. {
  235. display_time++;
  236. if(display_time==60)//240ms
  237. {       
  238.                 VR_data = ADC1Set(VR_Channel);//channel 0 pin16       
  239.                 TransData();
  240.                 LGC12002_display();       
  241.            display_time=0;
  242.   }               

  243. TIM4_ClearITPendingBit(TIM4_IT_UPDATE);
  244. }


  245. main()
  246. {
  247.         /*
  248. 一開始要關閉pwm輸出
  249. 接下來要把馬達的輸出設為60% 這樣啟動才不會有問題
  250. 馬達的PWM輸出不能過小必須有基本的電壓目前先定20%
  251. PWM 0%電壓為2V 100%為10V 因此輸出電壓平均為2V~10V
  252. 調整VR的%顯示應該放在不會受影響的程式裡考慮  放在中斷裡作顯示

  253.         */
  254.         GPIOinit();
  255.         GPIO_WriteLow(Motor_port,Motor_out);//  防止一通電就馬達暴衝  
  256.         TIM1_DeInit();
  257.         TIM1_TimeBaseInit(1,TIM1_COUNTERMODE_UP,1400,0);        //1400 full range from 200~1200 total 1.4ms
  258.   tim4init();
  259.         CLK_Config();
  260.   PT6961_Init();//LGC12002 initial               
  261.         prev_VR_data = 200;//set initial VR data;
  262.         pwmwidth = 240;//initial motor drive set 60% power and keep 2秒
  263.        
  264.         rim();
  265.         VR_data = ADC1Set(VR_Channel);//先顯示VR值再啟動馬達240+200=440的速度若VR=0則會回到最低速200
  266.         TransData();
  267.         LGC12002_display();               
  268.        
  269.         update_TIM1_Config(0);
  270.         DelayMs(2000);
  271.         while (1)       
  272.         {

  273. //                VR_data = ADC1Set(VR_Channel);//channel 0 pin16       
  274. //                TransData();
  275. //                LGC12002_display();               

  276.                 if(prev_VR_data >= VR_data)//inc_flag =0 ---prev_VR_data >= VR_data 要減少pwm
  277.                 {
  278.                         inc_flag = 0;
  279.                         dif_PWM = (prev_VR_data - VR_data);                       
  280.                 }
  281.                 else
  282.                 {
  283.                  inc_flag =1;
  284.                  dif_PWM = (VR_data - prev_VR_data);
  285.           }
  286.                
  287.                 if( dif_PWM > 5)// excute PWM change
  288.                 {
  289.                         while(dif_PWM)
  290.                         {
  291.                                 if(inc_flag)
  292.                                         {
  293.                                                 pwmwidth = prev_VR_data+1;
  294.                                         }
  295.                                 else
  296.                                         {
  297.                                                 pwmwidth = prev_VR_data-1;
  298.                                         }
  299.                          update_TIM1_Config(0);
  300.                          DelayMs(5);
  301.                          dif_PWM -=1;
  302.                   }
  303.                         prev_VR_data = VR_data;
  304.                 }
  305.                 else
  306.                 {
  307.                         pwmwidth = VR_data;
  308.                         update_TIM1_Config(0);
  309.                 }                 
  310.         }
  311. }


  312. @far @interrupt void TIM4_OVF_IRQ(void)
  313. {
  314.         tim4svc();
  315. }




  316. #ifdef USE_FULL_ASSERT

  317. /**
  318.   * @brief  Reports the name of the source file and the source line number
  319.   *   where the assert_param error has occurred.
  320.   * @param file: pointer to the source file name
  321.   * @param line: assert_param error line source number
  322.   * @retval : None
  323.   */
  324. void assert_failed(u8* file, u32 line)
  325. {
  326.   /* User can add his own implementation to report the file name and line number,
  327.      ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */

  328.   /* Infinite loop */
  329.   while (1)
  330.   {
  331.   }
  332. }
  333. #endif

  334. /******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
複製代碼

補充內容 (2016-7-2 01:15 AM):
抱歉!! 發現程式有點BUG請勿直接使用!!

評分

2

查看全部評分

發表於 2016-7-1 09:30:29 | 顯示全部樓層
有看沒有懂 贊一個
 樓主| 發表於 2016-7-1 12:11:07 | 顯示全部樓層
kuo0202 發表於 2016-7-1 09:30 AM
有看沒有懂 贊一個

抱歉!! 寫的比較亂!! 這裡面大致上就是我先前提到的功能,開機後 先把輸出停止 接下來讀取可變電阻的設定,之後 輸出 馬達預設的啟動PWM量(馬達啟動電流較大)經過2秒後再把PWM的比例以每差1單位5豪秒的速度加上去直到達到設定為止!! 顯示部分 利用中斷每0.24秒更新一次...就這樣囉!!

評分

1

查看全部評分

發表於 2016-7-1 12:42:28 | 顯示全部樓層
antlu 發表於 2016-7-1 12:11 PM
抱歉!! 寫的比較亂!! 這裡面大致上就是我先前提到的功能,開機後 先把輸出停止 接下來讀取可變電阻的設定, ...

你誤會我的意思是我完全不懂語言程式..鴉子聽雷...
發表於 2016-7-1 21:05:20 | 顯示全部樓層
antlu 發表於 2016-7-1 12:21 AM
今天又改了一下程式應該可以分享了!!

lu 大 試試看把 filter 直接做在 ADC subroutine 裡面, 變數都設在 全局, 不需要再挑10挑6.
可能會有意想不到的收穫
或者你用EXCEL試試看, 把第一個,第二個ADC值設成 255, 後來都100, 看看filter output, 或許有所發現.
 樓主| 發表於 2016-7-2 01:18:02 | 顯示全部樓層
xiaolaba 發表於 2016-7-1 09:05 PM
lu 大 試試看把 filter 直接做在 ADC subroutine 裡面, 變數都設在 全局, 不需要再挑10挑6.
可能會有意想 ...

XIAOLABA大:
   //------ newADCfilter with digital filter 2016 0630

void newDigitalFiltering(void)//把類比信號的10組資料作中間的6組平均
{       
        u8 i=0;
        ADCtemp=0;
  for(i=0; i<15;i++)
        {
                ADCtemp = ADCtemp-(ADCtemp/4)+ADCValue;
                DataADC = (ADCtemp/4);
         }
}

這樣!! 數值需要做15次才OK!!
 樓主| 發表於 2016-7-2 01:20:54 | 顯示全部樓層
  1. //-------20160701 改回原程式 因為中斷會造成控制不良 為無中斷模式
  2. //-------20160622 VV--------------------- 非常重要使用中斷 TIM4  main.c 最後要加一些宣告!!
  3. //----20160630 修改啟動程序 先顯示後驅動
  4. #include "stm8s.h"
  5. #include "stm8s_tim1.h"
  6. #include "stm8s_tim4.h"
  7. #include "stm8s_clk.h"
  8. #include "stm8s_delay.h"
  9. #include "stm8s_adc1.h"
  10. #define VR_Channel ADC1_CHANNEL_0// stm8s103k3 pin 16
  11. #define LG12002PORT GPIOC//GPIOC
  12. #define DIN GPIO_PIN_7  //new PIN_4 old version PIN_1
  13. #define Clk GPIO_PIN_6  //new PIN_3 old version PIN_2
  14. #define STB GPIO_PIN_5  //new PIN_1 old version PIN_4
  15. #define Motor_port GPIOC
  16. #define Motor_out GPIO_PIN_1  //PC1 pwm motor driver
  17. u8 a,b,c,d;
  18. u16 VR_data =0;
  19. u8 AD_read_count;//0~3 輪流read out AD count
  20. u8 adc_update_flag;//ADC 更新1次的旗標
  21. u16 pwmwidth = 1;
  22. u16 ADCValue[15]={0};//電壓值平均用減少誤差雜訊
  23. u16 DataADC=0;//最後的電壓值
  24. u8 display_2table[20]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};
  25. u16 prev_VR_data;//previous VR data
  26. u8 inc_flag;//prev_VR_data < VR_data
  27. u16 dif_PWM;//prev_VR_data - VR_data
  28. u16 motor_base = 200;//motor PWM base
  29. u16 ADCtemp=0;
  30. u8 display_time;
  31. void GPIOinit(void)
  32. {
  33.         GPIO_Init(Motor_port,Motor_out,GPIO_MODE_OUT_PP_HIGH_FAST);//motor drive
  34.         GPIO_Init(LG12002PORT,DIN|STB|Clk,GPIO_MODE_OUT_PP_HIGH_FAST);//for pt6961 driver
  35. }


  36. void Delay_us(u16 ust)//uS Delay
  37. {
  38.         while(ust !=0)
  39.         {
  40.                 ust--;
  41.         }
  42. }

  43. void DelayMs(u16 mst)//mS delay
  44. {
  45.         while( mst !=0)
  46.         {
  47.                 Delay_us(400);
  48.                 mst--;
  49.         }
  50. }

  51. void Send6961_Data(u8 Dat)
  52. {
  53.           u8 i;
  54.         GPIO_WriteLow(LG12002PORT,STB);
  55.       
  56.                  for (i=0;i<8;i++)
  57.                  {
  58.                           if((Dat & 0x01)!=0)// SER=Dat & 0x80;
  59.                 {
  60.                  GPIO_WriteHigh(LG12002PORT,DIN);
  61.                   }
  62.                 else
  63.                 {
  64.                 GPIO_WriteLow(LG12002PORT,DIN);
  65.                 }
  66.                   Dat>>=1;
  67.                   GPIO_WriteLow(LG12002PORT,Clk);//  GPIO_WriteLow(LEDPORT,Clk);
  68.                   GPIO_WriteHigh(LG12002PORT,Clk);
  69.                  }       
  70.         GPIO_WriteLow(LG12002PORT,STB);  
  71. }

  72. /*
  73.    20141116 send command byte
  74. */

  75. void Send6961_Cmd(u8 Dat)
  76. {
  77.   u8 i;
  78.     GPIO_WriteHigh(LG12002PORT,STB);
  79.    GPIO_WriteLow(LG12002PORT,STB);
  80.       
  81.      for (i=0;i<8;i++)
  82.          {
  83.           if((Dat & 0x01)!=0)// SER=Dat & 0x80;
  84.         {
  85.          GPIO_WriteHigh(LG12002PORT,DIN);
  86.           }
  87.         else
  88.         {
  89.         GPIO_WriteLow(LG12002PORT,DIN);
  90.         }
  91.           Dat>>=1;
  92.           GPIO_WriteLow(LG12002PORT,Clk);// Clk=0;
  93.           GPIO_WriteHigh(LG12002PORT,Clk);
  94.          }
  95.         GPIO_WriteHigh(LG12002PORT,STB);
  96. }

  97. void PT6961_Init(void) // 8bit mode
  98. {
  99.         DelayMs(200);
  100.         Send6961_Cmd(0x40);//CMD 2 fix address normal mode
  101.         Send6961_Cmd(0xc0);//CMD 3 address=0
  102.         Send6961_Data(0x0);
  103.         Send6961_Data(0x00);
  104.         Send6961_Data(0x00);
  105.         Send6961_Data(0x00);       
  106.         Send6961_Cmd(0x02);//CMD 1 6digit 12segment
  107.         Send6961_Cmd(0x89);//CMD 4 display control bright 14/16
  108.         DelayMs(1);       
  109. }


  110. void LGC12002_display(void)
  111. {
  112. Send6961_Cmd(0x40);//CMD 2 fix address normal mode
  113. Send6961_Cmd(0xc0);//CMD 3 address=0
  114. Send6961_Data(0xf0);//空白
  115. Send6961_Data(display_2table[a]);//5
  116. Send6961_Data(0xf0);//空白
  117. Send6961_Data(display_2table[b]);//5
  118. Send6961_Data(0xf0);//空白
  119. Send6961_Data(display_2table[c]);//2
  120. Send6961_Data(0xf0);//空白
  121. Send6961_Data(display_2table[d]);//4
  122. Send6961_Cmd(0x02);//CMD 1 6digit 12segment
  123. Send6961_Cmd(0x89);//CMD 4 display control bright 14/16                       
  124. DelayMs(1);       
  125. }

  126. void TransData(void)// VR_data>> a b c d
  127. {
  128.         u16 result;
  129.         result = VR_data;
  130.          if (result >= 1000)
  131.    {
  132.           a=1;b=0;c=0;d=0;
  133.    }
  134.         else
  135.    {
  136.           a=0;
  137.           b= result/100;
  138.           c= (result%100)/10;
  139.           d= result %10;
  140.    }
  141. }



  142. //-------20160622 ^^----------------
  143. void ADConvert(void)//轉換類比信號成為數位信號
  144. {
  145.         unsigned char ADCcount =0;
  146.         ADC1->CR1|=0x02;
  147.         ADC1_StartConversion();
  148.         while(ADCcount<15)//10>>13
  149.         {
  150.                 while(ADC1_GetFlagStatus(ADC1_FLAG_EOC)==RESET);
  151.                 ADC1_ClearFlag(ADC1_FLAG_AWS0);
  152.                 ADCValue[ADCcount]=ADC1_GetConversionValue();
  153.                 ADCcount++;
  154.         }
  155.         ADC1->CR1 &= ~0x02;
  156. }

  157. //------ newADCfilter with digital filter 2016 0630

  158. void newDigitalFiltering(void)//把類比信號的10組資料作中間的6組平均
  159. {       
  160.         u8 i=0;
  161.         ADCtemp=0;
  162.   for(i=0; i<15;i++)
  163.         {
  164.                 ADCtemp = ADCtemp-(ADCtemp/4)+ADCValue[i];
  165.                 DataADC = (ADCtemp/4);
  166.          }
  167. }




  168. unsigned int ADC1Set(ADC1_Channel_TypeDef ADC_Channel)//讀取不同的AD通道經過類比轉成數位再經過10取6平均送出結果
  169. {
  170. u16 ADresult;
  171. {
  172. ADC1_Init(ADC1_CONVERSIONMODE_CONTINUOUS,ADC_Channel,ADC1_PRESSEL_FCPU_D2,ADC1_EXTTRIG_TIM,DISABLE,ADC1_ALIGN_RIGHT,ADC1_SCHMITTTRIG_CHANNEL0,DISABLE);
  173. ADConvert();
  174. newDigitalFiltering();
  175. ADresult=DataADC;
  176. DataADC=0;
  177. adc_update_flag=0;
  178. }
  179. return ADresult;
  180. }



  181. void update_TIM1_Config(u8 sw)
  182. {
  183.         switch(sw)
  184.         {
  185.         case 0:
  186.                 TIM1_OC1Init(TIM1_OCMODE_PWM2,TIM1_OUTPUTSTATE_ENABLE,TIM1_OUTPUTNSTATE_ENABLE,(pwmwidth+motor_base),TIM1_OCPOLARITY_LOW,TIM1_OCNPOLARITY_HIGH,TIM1_OCIDLESTATE_SET,TIM1_OCNIDLESTATE_RESET);
  187.         break;

  188.         case 1:
  189.                 TIM1_OC2Init(TIM1_OCMODE_PWM2,TIM1_OUTPUTSTATE_ENABLE,TIM1_OUTPUTNSTATE_ENABLE,pwmwidth,TIM1_OCPOLARITY_LOW,TIM1_OCNPOLARITY_HIGH,TIM1_OCIDLESTATE_SET,TIM1_OCNIDLESTATE_RESET);
  190.         break;

  191.         case 2:
  192.                 TIM1_OC3Init(TIM1_OCMODE_PWM2,TIM1_OUTPUTSTATE_ENABLE,TIM1_OUTPUTNSTATE_ENABLE,pwmwidth+20,TIM1_OCPOLARITY_LOW,TIM1_OCNPOLARITY_HIGH,TIM1_OCIDLESTATE_SET,TIM1_OCNIDLESTATE_RESET);
  193.         break;
  194.         }
  195.         TIM1_Cmd(ENABLE);
  196.         TIM1_CtrlPWMOutputs(ENABLE);
  197. }

  198. void CLK_Config(void)
  199. {
  200.         CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV8);
  201. }

  202. void tim4svc(void)
  203. {

  204. display_time++;
  205. if(display_time==60)//240ms
  206. {       
  207.                 VR_data = ADC1Set(VR_Channel);//channel 0 pin16       
  208.                 TransData();
  209.                 LGC12002_display();       
  210.            display_time=0;
  211.   }               

  212. TIM4_ClearITPendingBit(TIM4_IT_UPDATE);
  213. }


  214. main()
  215. {
  216.         /*
  217. 一開始要關閉pwm輸出
  218. 接下來要把馬達的輸出設為60% 這樣啟動才不會有問題
  219. 馬達的PWM輸出不能過小必須有基本的電壓目前先定20%
  220. PWM 0%電壓為2V 100%為10V 因此輸出電壓平均為2V~10V
  221. 調整VR的%顯示應該放在不會受影響的程式裡考慮  放在中斷裡作顯示

  222.         */
  223.         GPIOinit();
  224.         GPIO_WriteLow(Motor_port,Motor_out);//  防止一通電就馬達暴衝  
  225.         TIM1_DeInit();
  226.         TIM1_TimeBaseInit(1,TIM1_COUNTERMODE_UP,1400,0);        //1400 full range from 200~1200 total 1.4ms
  227.         CLK_Config();
  228.   PT6961_Init();//LGC12002 initial               
  229.         prev_VR_data = 200;//set initial VR data;
  230.         pwmwidth = 240;//initial motor drive set 60% power and keep 2秒
  231.        
  232.         VR_data = ADC1Set(VR_Channel);//先顯示VR值再啟動馬達240+200=440的速度若VR=0則會回到最低速200
  233.         TransData();
  234.         LGC12002_display();               
  235.        
  236.         update_TIM1_Config(0);
  237.         DelayMs(2000);
  238.         while (1)       
  239.         {

  240.         VR_data = ADC1Set(VR_Channel);//channel 0 pin16       
  241.                 TransData();
  242.                 LGC12002_display();               

  243.                 if(prev_VR_data >= VR_data)//inc_flag =0 ---prev_VR_data >= VR_data 要減少pwm
  244.                 {
  245.                         inc_flag = 0;
  246.                         dif_PWM = (prev_VR_data - VR_data);                       
  247.                 }
  248.                 else
  249.                 {
  250.                  inc_flag =1;
  251.                  dif_PWM = (VR_data - prev_VR_data);
  252.           }
  253.                
  254.                 if( dif_PWM > 5)// excute PWM change
  255.                 {
  256.                         while(dif_PWM)
  257.                         {
  258.                                 if(inc_flag)
  259.                                         {
  260.                                                 pwmwidth = prev_VR_data+1;
  261.                                         }
  262.                                 else
  263.                                         {
  264.                                                 pwmwidth = prev_VR_data-1;
  265.                                         }
  266.                          update_TIM1_Config(0);
  267.                          DelayMs(5);//加速度
  268.                          dif_PWM -=1;
  269.                   }
  270.                         prev_VR_data = VR_data;//加減速完成更新速度設定
  271.                 }
  272.                 else
  273.                 {
  274.                         pwmwidth = VR_data;
  275.                         update_TIM1_Config(0);
  276.                 }                 
  277.         }
  278. }


  279. @far @interrupt void TIM4_OVF_IRQ(void)
  280. {
  281.         tim4svc();
  282. }




  283. #ifdef USE_FULL_ASSERT

  284. /**
  285.   * @brief  Reports the name of the source file and the source line number
  286.   *   where the assert_param error has occurred.
  287.   * @param file: pointer to the source file name
  288.   * @param line: assert_param error line source number
  289.   * @retval : None
  290.   */
  291. void assert_failed(u8* file, u32 line)
  292. {
  293.   /* User can add his own implementation to report the file name and line number,
  294.      ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */

  295.   /* Infinite loop */
  296.   while (1)
  297.   {
  298.   }
  299. }
  300. #endif

  301. /******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
  302. 中斷部分 .C

  303. /*        BASIC INTERRUPT VECTOR TABLE FOR STM8 devices
  304. *        Copyright (c) 2007 STMicroelectronics
  305. */

  306. typedef void @far (*interrupt_handler_t)(void);

  307. struct interrupt_vector {
  308.         unsigned char interrupt_instruction;
  309.         interrupt_handler_t interrupt_handler;
  310. };

  311. @far @interrupt void NonHandledInterrupt (void)
  312. {
  313.         /* in order to detect unexpected events during development,
  314.            it is recommended to set a breakpoint on the following instruction
  315.         */
  316.         return;
  317. }

  318. @far @interrupt extern void TIM4_OVF_IRQ (void);
  319. //     @far @interrupt void TIM4_OVF_IRQ(void)


  320. extern void _stext();     /* startup routine */

  321. struct interrupt_vector const _vectab[] = {
  322.         {0x82, (interrupt_handler_t)_stext}, /* reset */
  323.         {0x82, NonHandledInterrupt}, /* trap  */
  324.         {0x82, NonHandledInterrupt}, /* irq0  */
  325.         {0x82, NonHandledInterrupt}, /* irq1  */
  326.         {0x82, NonHandledInterrupt}, /* irq2  */
  327.         {0x82, NonHandledInterrupt}, /* irq3  */
  328.         {0x82, NonHandledInterrupt}, /* irq4  */
  329.         {0x82, NonHandledInterrupt}, /* irq5  */
  330.         {0x82, NonHandledInterrupt}, /* irq6  */
  331.         {0x82, NonHandledInterrupt}, /* irq7  */
  332.         {0x82, NonHandledInterrupt}, /* irq8  */
  333.         {0x82, NonHandledInterrupt}, /* irq9  */
  334.         {0x82, NonHandledInterrupt}, /* irq10 */
  335.         {0x82, NonHandledInterrupt}, /* irq11 */
  336.         {0x82, NonHandledInterrupt}, /* irq12 */
  337.         {0x82, NonHandledInterrupt}, /* irq13 */
  338.         {0x82, NonHandledInterrupt}, /* irq14 */
  339.         {0x82, NonHandledInterrupt}, /* irq15 */
  340.         {0x82, NonHandledInterrupt}, /* irq16 */
  341.         {0x82, NonHandledInterrupt}, /* irq17 */
  342.         {0x82, NonHandledInterrupt}, /* irq18 */
  343.         {0x82, NonHandledInterrupt}, /* irq19 */
  344.         {0x82, NonHandledInterrupt}, /* irq20 */
  345.         {0x82, NonHandledInterrupt}, /* irq21 */
  346.         {0x82, NonHandledInterrupt}, /* irq22 */
  347.         {0x82, TIM4_OVF_IRQ}, /* irq23 ITC_IRQ_TIM4_OVF*/
  348.         {0x82, NonHandledInterrupt}, /* irq24 */
  349.         {0x82, NonHandledInterrupt}, /* irq25 */
  350.         {0x82, NonHandledInterrupt}, /* irq26 */
  351.         {0x82, NonHandledInterrupt}, /* irq27 */
  352.         {0x82, NonHandledInterrupt}, /* irq28 */
  353.         {0x82, NonHandledInterrupt}, /* irq29 */
  354. };
複製代碼
發表於 2016-7-2 09:46:13 | 顯示全部樓層
antlu 發表於 2016-7-2 01:18 AM
XIAOLABA大:
   //------ newADCfilter with digital filter 2016 0630

這樣, st 的C可以順利編譯嗎?
一般MCU的ADC都是單端, 例如8BIT, 0x00-0xFF, 轉換時不需要理會正負號. 如果真的要處理, 運算時你把它上移 +0x7F, 就可以處理交流訊號. 不過你這個案例, 只要+0到255就可以

        unsigned int ADCtemp=0;
        unsigned char DataADC = 0;

void newDigitalFiltering(void)
{      

                ADCtemp = ADCtemp-(ADCtemp/4)+ADCValue;
                DataADC = (ADCtemp/4);
}
 樓主| 發表於 2016-7-2 17:18:05 | 顯示全部樓層
xiaolaba 發表於 2016-7-2 09:46 AM
這樣, st 的C可以順利編譯嗎?
一般MCU的ADC都是單端, 例如8BIT, 0x00-0xFF, 轉換時不需要理會正負號. 如 ...

xiaolaba大:
   這樣 A/D 轉換如何一直延續下去,程式我不太會寫!! 我目前都是一次讀 15次存起來做處裡...

  還有昨天發現一個問題,我原本想利用中斷來做LED顯示,卻發現它會造成 PWM ON的部分會有 中斷的脈衝產生,忘了把它記錄起來,控制也出了點問題,所以把它改回去了..
發表於 2016-7-2 21:36:15 | 顯示全部樓層
本文章最後由 xiaolaba 於 2016-7-2 09:52 PM 編輯
antlu 發表於 2016-7-2 05:18 PM
xiaolaba大:
   這樣 A/D 轉換如何一直延續下去,程式我不太會寫!! 我目前都是一次讀 15次存起來做處裡... ...

LU大 ADC讀取不是由你的主程序自己主動要求的嗎

你的程序裡面好像也是這樣寫, 269行,while (1) {readadc....task1...task2...等等等等}. 所以一直在反覆讀取ADC, 然後執行你希望的工作.

FILTER的用意只是把你讀入的每一次ADC數據用比較簡便方法過濾雜訊, 提高執行速度, 並沒有停止原來的讀取策略. 但是不需要停下來, 連續讀15次, 求平均值而不做其他任何事, 這樣, 程序的處理速度就會呆滯, 外表看來就是反應遲緩, 試想, 剛開始第一個ADC讀取, 同時你改變VR, 那也必須等到讀完十五次才會做其他事, 但是, 可能過程結束前你又調了VR. 當然平均出來還是有點靠譜, 不過這個策略迫使你的機器完全忽略你已經很快調高又調低的期望.

希望這樣理解, 沒誤會你說的問題.

運用中斷, 不能把所有期望的工作都放在中斷函數, 一般都是設定一個全局變數, 設定旗標A, 做個記號說明有事情等著你做, 然後就退出, 讓CPU繼續做他原來該做的事情. 那等著你做事呢, 應該是你的主程序裡面其中一個要例行做的工作, 只要發現旗標A被設定, 那你的主程序就知道要做動作A, 不然就略過, 繼續做其他動作, 然後又再沖頭開始看看有甚麼事要做, 一直循環到掉電為止.

這個是 MCU的基本程序觀念, 但是 C把它簡化太多了, 很多近代的C由於每家公司希望更多人寫給他們家的MCU, 更加包含了很多抽象層面的東西, 把CPU實際操作的基本步都掩埋起來, 所以學C起步的人, 很多時候會被自己寫的東西蒙蔽的, 最終還是要看看MCU的基本才會徹底畢業.
加油..

另外看了STM8 ADC, 他說是 10BIT, ADC時間6.3us, 那需要把運算的記憶體變數設定成大於 24 BIT 和 16 BIT 才不會 OVERFLOW
STM8_ADC.PNG

試試看這樣
        unsigned long ADCtemp=0; //32bit, 10bit + 10bit + 10bit/4 >16bit
        unsigned int DataADC = 0; //16bit, contain 10bit value is ok

void newDigitalFiltering(void)
{      

                ADCtemp = ADCtemp-(ADCtemp/4)+ADCValue;
                DataADC = (ADCtemp/4);
}

評分

1

查看全部評分

 樓主| 發表於 2016-7-2 21:59:26 | 顯示全部樓層
xiaolaba 發表於 2016-7-2 09:36 PM
LU大 ADC讀取不是由你的主程序自己主動要求的嗎

你的程序裡面好像也是這樣寫, 269行,while (1) {readadc. ...

xiaolaba 大:
   感謝這麼詳細的指導,我會繼續把這程式最佳化!!
您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

關閉

站長小叮嚀上一條 /1 下一條

禁閉室|手機版|連繫我們|痞酷網電子技術論壇

GMT+8, 2024-11-24 12:54 PM , Processed in 0.287138 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4 Licensed

© 2001-2023 Discuz! Team.