你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM8 控制电脑风扇转速 4PIN PWM

[复制链接]
abv123 发布时间:2018-1-6 21:20
一个很简单的例子读取电位器电压,然后调整占空比6 B, P% x* s, t' t9 b

  U' \% k; @1 v" o# h3 ~' z AIS_AIR_V3_11_3.png $ o7 g6 x. d5 Q# H
AIS_AIR_V3_11_2.png
" J( U5 t- N3 P$ t0 _ AIS_AIR_V3_11_1.png + `' ?( K' b& ~5 i  g6 S; u6 j8 Q
" l, Z/ n! `' e( s
程序代码:
0 Z* T, [+ w# {0 Z4 R& a
  1. #include "stm8s.h"
    ! q! G! d+ ^7 l0 u1 I/ J2 r
  2. #include "stm8s_gpio.h"
    ; a4 s, b+ f2 p* j; w  m& ~3 b
  3. & _2 Z8 p9 _9 S) W4 F  Q6 b
  4. #define PWM_F  640
    8 V2 M' ~( h) M2 l& ^  W( M

  5. / Q+ e. Q! w8 H! l, h. [3 I
  6. uint8_t HexTable[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
    7 c" U& q0 a8 o# _3 ?
  7. uint16_t CCR1_Val = 100;$ `9 d" v  s3 w+ M/ d
  8. 5 |" p3 N! p5 G! O8 D0 t
  9. void DelayApi(uint16_t uwDelayCnt);
    : o) e- I! Z2 R( ]" D) O7 b
  10. void TIM2_Config(void);
    . h0 o: J$ m7 z9 z* P6 L

  11. " A3 Q5 a, ^/ G: [0 b3 c0 {
  12. void Init_UART1(void)" @/ M$ C8 B9 w6 P
  13. {9 i. i6 o( x, Y* g/ p
  14.         UART1_DeInit();
    ) L2 B9 P# F+ Z" t
  15.         UART1_Init((u32)9600, UART1_WORDLENGTH_8D, UART1_STOPBITS_1, UART1_PARITY_NO, UART1_SYNCMODE_CLOCK_DISABLE, UART1_MODE_TX_ENABLE);
    ( }4 H" Z0 S! g4 C2 \
  16. //        UART1_Cmd(ENABLE);7 _2 I0 N# k8 @* h$ q- l
  17. }& i5 ^/ \: z& ]) y8 i# z
  18. void Send(uint8_t dat)
    % [6 G6 Q2 c  J. M- u* v* H* H
  19. {
    & q8 L0 A$ B( L
  20.     while(( UART1_GetFlagStatus(UART1_FLAG_TXE)==RESET));
    ( V' }/ m, ?0 F. S* f3 c
  21.         & x$ C) c& s( B' f7 |
  22.     UART1_SendData8(dat);( z& N' Z' f2 f' G; s2 F
  23.        
    ) G7 H) H! P( U7 [1 c; X( h
  24. }$ b* e2 A7 ~; j/ i
  25. void Init_ADC(void)
    ! x4 {  b' m) {- g# i0 P. D
  26. {9 W# H8 R8 z2 t1 J* g+ q
  27.         //GPIO_Init(GPIOD, GPIO_PIN_2, GPIO_MODE_IN_FL_NO_IT);. `  L0 u: ~6 c: r) s& o3 F
  28.         ADC1_DeInit();- o/ m3 a0 V1 s/ R( T
  29.         ADC1_Init(ADC1_CONVERSIONMODE_SINGLE, ADC1_CHANNEL_3, ADC1_PRESSEL_FCPU_D2, ADC1_EXTTRIG_TIM, DISABLE, ADC1_ALIGN_RIGHT, ADC1_SCHMITTTRIG_CHANNEL3, ENABLE);
    8 s* m4 G8 u% V$ v8 k
  30.         ADC1_Cmd(ENABLE);0 }6 F3 v2 w& e+ q- e8 S) b
  31. }
    , \8 i5 }- b1 d& O
  32. void UART1_sendhex(unsigned char dat)8 o" G' A3 H3 s2 r7 S2 ]8 ^) K
  33. {
    . W/ b# }6 F9 T8 y, z
  34.     Send('0');% ^+ H# Y# _- ~/ J& _4 Y8 V# R$ L0 V
  35.                
    - h! @% \3 Y% S" i1 [1 ?: ~
  36.     Send('x');5 T+ `6 Y& @3 t  }
  37.                
    $ ?8 O* m3 X9 C- |
  38.     Send(HexTable[dat>>4]);
    / D3 q+ S) s8 q7 V
  39.                 ; c4 D9 \, V1 n7 C/ @, u/ a
  40.     Send(HexTable[dat&0x0f]);
    ! @, m& s, a5 d  U- f+ u
  41.                
    / L6 u: ]: }, M( x
  42.     Send(' ');
    % C  y/ _; f* ?/ ?- k' l- p2 [
  43. }
    - {4 w) @1 E) e8 n5 N7 h4 |
  44. void UART1_sendstr(unsigned char *dat)" c6 |4 v: D4 }: B9 }  j3 L
  45. {
    # A4 o" [' b6 A$ E7 y
  46.     while(*dat!='\0')' a& C3 v+ c; k8 p
  47.                
    5 J9 K6 `/ }* k; g. `7 B
  48.     {! P' e' M' ^% |1 F% g
  49.                                
    / a3 |7 x, S+ u4 V0 ~' [; u
  50.       Send(*dat);& Z+ L2 g. |) P$ A3 t
  51.                                 ; |7 g/ N3 q' h4 O' ^( b, |
  52.       dat++;
    8 G: ^9 p, I+ n/ K
  53.       //delay2us();, h7 r, ~3 p. |* F) a- }
  54.                
    ' x5 V! F4 B9 r/ g8 a; r
  55.     }
    5 F, I7 ?7 Q* y' P' Z* w' w" U
  56. }
    : o/ H7 n4 E5 @- e4 x, N+ i
  57. void main(void)9 h5 T! s0 Y4 {0 n' t
  58. {
    2 F* h5 i; q& R; B4 [" O/ b
  59.     //FlagStatus flag_status;
    " O7 b! v, c3 S0 g+ C0 S! @6 f% \9 g
  60.     u16 u16_adc1_value;, L# g% c! I* e! q6 r2 s
  61.     //Init_UART1();
    ( D# G& I! d# A8 Q6 X! Z1 G0 U1 V
  62.     Init_ADC();
    # m- _2 z/ h# o, a" _9 f  [* y( k
  63.     / L4 Z6 I' P: F+ h, k- Q
  64.     CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);//16/1=16MHZ2 \' M' ^1 l9 A3 t# z
  65.     GPIO_DeInit(GPIOD);
    3 }3 Q- j) a5 `
  66.     GPIO_Init(GPIOD,GPIO_PIN_2,GPIO_MODE_IN_PU_NO_IT);) A6 P& c  c! j; b9 }' \
  67.     //GPIO_DeInit(GPIOD);4 ^4 [, _6 M3 [! r$ s7 _
  68.     GPIO_Init(GPIOD,GPIO_PIN_4,GPIO_MODE_OUT_PP_HIGH_SLOW);+ J" @- G* x# Q5 S: D* b
  69.    
    " P% `0 _' F& u( I# R
  70.     TIM2_Config(); / ]% }% X% W5 @2 w% \2 b. o
  71.     TIM2_SetCompare1(CCR1_Val);
    4 }* P) n% t: p5 R- H7 v. s
  72. /* Infinite loop *// P) G7 B* \+ a1 \% k& n" p
  73.     while (1)2 r" Q! q4 T3 \9 Q: [2 u2 U) u3 E/ ]
  74.     {7 F9 f& Q4 F/ J1 d5 m  U
  75.                 //Send(0xf0);5 \% u, q& \- h0 O
  76.          ADC1_StartConversion();
    ; U0 h/ I- i, z1 b+ A+ b0 D
  77.          //flag_status = ADC1_GetFlagStatus(ADC1_FLAG_EOC);& O8 Q9 `- f$ m7 C% v
  78.         // while(flag_status == RESET); // SET or RESET
    / u, ~) m- W- B3 j
  79.          while(RESET == ADC1_GetFlagStatus(ADC1_FLAG_EOC));
    , S, _/ ^) h$ w: r, b( A/ L
  80.              u16_adc1_value = ADC1_GetConversionValue();
    / ^0 u* L3 p8 g, x) T/ y
  81.          //CCR1_Val=u16_adc1_value*2/3-66;
    8 m* O% f9 r! Q$ }. ^4 Y- Y( n
  82.          //CCR1_Val=101+u16_adc1_value*10/19;
    8 X1 Q+ _3 p8 V2 w( @# C" P: B" o
  83.          /*if(u16_adc1_value<180)
    ! i  {  t: q9 t. V; c6 |
  84.          {
    ) h, s2 p' j$ S( @# Q( `* q& Y
  85.             CCR1_Val=70+u16_adc1_value*2;" X9 d7 F6 h+ h
  86.          }else. s) S1 b5 S7 X- J7 w
  87.          {
    ) P2 J# o9 T& @+ _# N0 a
  88.           CCR1_Val=460+(u16_adc1_value-180)*10/47;* T" q8 [( m1 i; \& C
  89.          }5 F6 M* ~" f: Z; D- b/ ^3 l
  90.          */5 x  ^4 e" y5 v# m' J
  91.           if(u16_adc1_value<180)7 [+ i5 ]7 L  w' D
  92.           {
    - R! s5 z9 `2 @; M* x7 q" V% }
  93.             if(u16_adc1_value<100){u16_adc1_value=100;}
    ( l+ p$ |  w+ H7 a0 @
  94.             CCR1_Val=u16_adc1_value+((u16_adc1_value-100)*36/10);
    + a4 [: r: D1 ^0 I" Y
  95.           }else
    5 n3 p' [0 U* B: [9 z
  96.           {* v" u! A% [3 v
  97.             CCR1_Val=460+(u16_adc1_value-180)*10/47;
    2 g' f. P9 `' w0 b7 o$ G1 ~1 ^5 U
  98.           }8 m- L, c: c: C' R$ W) R
  99.            
    . O4 E. Z) O2 V$ R6 e
  100.          if(CCR1_Val>30000)
    : ^' b' ]0 f% Z5 |9 @4 |( `
  101.            CCR1_Val=0;0 {. ~+ A0 m; Z$ T/ G
  102.          if(CCR1_Val>PWM_F && CCR1_Val<2000)# y* ]" ]% K3 n) {
  103.            CCR1_Val=PWM_F-2;
    4 o* R6 W3 i8 |! t% H) B- Z4 z
  104.           TIM2_SetCompare1(CCR1_Val);0 M  ?, e, w. O6 t6 C) S. J
  105.          //UART1_sendhex((u16_adc1_value>>8));3 ]& S) O) V$ f6 X2 L
  106.          //UART1_sendhex((u16_adc1_value&0xff));* ^! R+ K7 I9 q/ w# E
  107.          //UART1_sendstr("\r\n");. D4 p( r% I  X4 Q* r" ^  \+ U/ Z
  108.          ! L3 e( P7 F9 B* }. _. s
  109.          //GPIO_WriteReverse(GPIOB,GPIO_PIN_5);! w$ n# W4 _4 Z
  110.          
    1 Z: p/ y4 n7 x5 ^4 G* V
  111.   }
    & X: v5 j5 y- K) c1 |: _. m2 A, y
  112.   ) V# m9 f* n! C
  113. }0 @! U& s' F) q/ N6 J: o3 u, C
  114. 5 L8 A% B- u! e6 ^
  115. void TIM2_Config(void)
    " L3 G1 H- |4 M, K5 {7 O" ]
  116. {6 e; h( R0 r8 ?5 P
  117. / D2 Y' b. b/ R/ S+ x+ B) o, x2 \
  118.   TIM2_TimeBaseInit(TIM2_PRESCALER_1, PWM_F);1 @/ H& t) n/ _1 o/ M! ?
  119. 3 a( ?2 V+ ?1 v% N( q$ A
  120.   TIM2_OC1Init(TIM2_OCMODE_PWM1, TIM2_OUTPUTSTATE_ENABLE,CCR1_Val, TIM2_OCPOLARITY_HIGH);
    ( F1 i$ K$ m+ e( Y/ V  L  r: h
  121.   TIM2_OC1PreloadConfig(ENABLE);/ B: Q& L* F- I# N' v
  122. 3 ?$ C% Z3 x9 Z; L; |
  123. //  TIM2_OC2Init(TIM2_OCMODE_PWM1, TIM2_OUTPUTSTATE_ENABLE,CCR2_Val, TIM2_OCPOLARITY_HIGH);( |+ |7 P7 z' E6 e5 f- N& X
  124. //  TIM2_OC2PreloadConfig(ENABLE);
    / {" U( F. i' d$ z2 I; @( r
  125.           3 ~& k0 `) _% p1 d/ a( _
  126. //  TIM2_OC3Init(TIM2_OCMODE_PWM1, TIM2_OUTPUTSTATE_ENABLE,CCR3_Val, TIM2_OCPOLARITY_HIGH);. M8 v/ h: _- i; ~- r, d
  127. //  TIM2_OC3PreloadConfig(ENABLE);
    " ?/ O1 c& @- \
  128.   TIM2_ARRPreloadConfig(ENABLE);
    ! p+ X7 t! O" h8 z% y8 c
  129. , {4 n7 W+ o. O
  130.   TIM2_Cmd(ENABLE);* `" H8 N% b) m9 d3 a
  131. }
    - K7 S4 U) z& _/ N% ^
  132. * H* w: H4 o$ f/ B( a9 H
  133. void DelayApi(uint16_t uwDelayCnt)
    % X* L$ k# l$ l) M. @9 g
  134. {* N/ o1 f+ e1 P
  135.   while(uwDelayCnt--);+ L7 g4 ~' y: q3 D* t
  136. }; ]/ [4 S0 C3 I1 A# i+ }

  137. + b+ S( x  e7 L: T2 j
  138. #ifdef USE_FULL_ASSERT
    ( B$ C; d+ A: ^0 P
  139. 0 ^) c. A) V& W# l
  140. /**; Z+ r1 X5 x6 r# B# a. C
  141.   * @brief  Reports the name of the source file and the source line number; B+ r, a3 O# v9 l, U2 W
  142.   *   where the assert_param error has occurred.
    2 s5 ?  K( e- u, r
  143.   * @param file: pointer to the source file name
    & e" q7 s* v+ `2 B; R/ Q4 y) T; t
  144.   * @param line: assert_param error line source number
    + S% d8 U& b+ p: K! n5 H' J* o
  145.   * @retval : None9 i: S4 k( e$ ^7 @+ n
  146.   */
    7 t! O+ f( T0 F5 g
  147. void assert_failed(u8* file, u32 line)
    4 C/ m, a! s6 o
  148. { 9 M" x( N) A# _- O
  149.   /* User can add his own implementation to report the file name and line number,
    + R) @. B8 z$ p2 O- ]
  150.      ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
    4 P0 @! \4 P* M, `! x. I- A

  151. 0 M! N. ~  v6 Y, Z/ Q( T/ r
  152.   /* Infinite loop */
    1 m1 i  V) O; o
  153.   while (1)/ W* S9 K1 n9 d- K. N5 J
  154.   {
    " z# m+ i6 V6 t, a  B/ O1 B
  155.   }
    0 a& c$ ]0 v& }& Z; B% y0 p" ^3 S
  156. }
    4 |3 m7 ]6 i0 D- V
  157. #endif
复制代码
3 D+ e5 G+ a+ u& }
% L$ ]7 A4 z( f
程序文件打包下载(IAR 包含原理图大图)
8 s% y1 y7 k4 U" i% `链接:https://pan.baidu.com/s/1i5aShzn 密码:t8rc" U* b) M! @1 f$ F2 A+ R

评分

参与人数 1 ST金币 +2 收起 理由
爅爩灙欟旝巘 + 2 很给力!

查看全部评分

收藏 1 评论5 发布时间:2018-1-6 21:20

举报

5个回答
robter 回答时间:2018-4-4 20:46:55
很好的资料,感谢感谢
hclin-146115 回答时间:2018-4-9 03:16:29
链接已过期
1315150719@qq.c 回答时间:2018-6-9 10:35:43
感谢分享
xanadu2009 回答时间:2018-10-17 21:04:05
/ M$ H' p% M0 U) t
感谢分享
robter 回答时间:2018-10-25 08:03:11
很好的应用实例,学习了
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版