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

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

[复制链接]
abv123 发布时间:2018-1-6 21:20
一个很简单的例子读取电位器电压,然后调整占空比
+ u9 n' |/ ]) j. U- c2 ^0 k3 |+ n0 F
AIS_AIR_V3_11_3.png
. }$ H, z- i7 E8 ~* E& O: ^ AIS_AIR_V3_11_2.png ! Z) ^3 T' y5 K
AIS_AIR_V3_11_1.png
) u: U1 Z7 _. G# \" _- M
! L( k8 e- X# K# G, G. i7 U1 t4 M1 L% z程序代码:+ V, T- v' k* \- T% v8 k3 [, d
  1. #include "stm8s.h": s. B3 f0 O* U0 B! m6 e6 ~
  2. #include "stm8s_gpio.h"
    6 g) P. T" w! g. x( r6 \$ B+ L
  3. & t' U4 @8 g1 S1 N' e* u/ u
  4. #define PWM_F  640% H4 l; O( z9 {0 W/ J

  5.   _7 {8 L2 I* Y; Z( b
  6. uint8_t HexTable[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};" j2 _; Y; \$ G2 G0 }5 `2 `
  7. uint16_t CCR1_Val = 100;
    * I) H$ y' Y( U2 v! n& ^6 A

  8. ; v; V3 l3 C1 T+ i3 I* M( }
  9. void DelayApi(uint16_t uwDelayCnt);* x" F3 z( \; R! Q
  10. void TIM2_Config(void);7 n4 b: X% k6 w3 ~: a, u

  11. 3 S0 ^! g7 V0 m' A" y
  12. void Init_UART1(void)
      F4 ^, v2 @  U% i8 x  l4 u
  13. {6 I4 A7 k3 P3 A6 _; p+ n9 o) X
  14.         UART1_DeInit();
    + Q9 J# H; e7 ]7 l2 ]! z  N
  15.         UART1_Init((u32)9600, UART1_WORDLENGTH_8D, UART1_STOPBITS_1, UART1_PARITY_NO, UART1_SYNCMODE_CLOCK_DISABLE, UART1_MODE_TX_ENABLE);
    7 A& f6 j- G& _5 A/ x- e
  16. //        UART1_Cmd(ENABLE);' P" {9 w0 U* }3 O/ _0 z, [
  17. }5 a2 \* W4 }, x8 w$ V
  18. void Send(uint8_t dat)
    $ }) [8 a8 X  ~9 e
  19. {
      H$ V8 S5 n4 p  b, `+ v
  20.     while(( UART1_GetFlagStatus(UART1_FLAG_TXE)==RESET));
    " E& ]7 E$ _; G( ~: L( N0 {' r  M) A
  21.         % F. z- J- Y* J* f3 H' T2 R
  22.     UART1_SendData8(dat);
    2 i. P* [5 m  w; C" H
  23.         0 g; U  O4 j3 Q$ R& l
  24. }
    , `, `8 E- _. g. L4 l3 K% k0 I
  25. void Init_ADC(void)5 S% b4 r+ S  F) {- \5 y! c$ G1 Z) u
  26. {  |7 u9 M7 a. l" m3 n
  27.         //GPIO_Init(GPIOD, GPIO_PIN_2, GPIO_MODE_IN_FL_NO_IT);- m) T: R" L! \. L% D
  28.         ADC1_DeInit();
    5 x3 b6 l1 |: `8 E5 G# Q
  29.         ADC1_Init(ADC1_CONVERSIONMODE_SINGLE, ADC1_CHANNEL_3, ADC1_PRESSEL_FCPU_D2, ADC1_EXTTRIG_TIM, DISABLE, ADC1_ALIGN_RIGHT, ADC1_SCHMITTTRIG_CHANNEL3, ENABLE);
    9 A" Y* k1 f5 V# |; R7 d
  30.         ADC1_Cmd(ENABLE);
    , @8 x8 c( C/ D" M4 W" w( ?3 M. v
  31. }8 q8 _" g! u, ]+ s$ |9 ?# ?
  32. void UART1_sendhex(unsigned char dat)4 x2 P& v/ F/ J0 z
  33. {" T6 k7 S2 x7 T' r5 Y' p
  34.     Send('0');
    + ]. j6 o5 G, }
  35.                 # `" L* b9 U# u
  36.     Send('x');
    / `7 P5 y- i2 O! k# g& t' d( o# n: m+ j' j
  37.                
    - O0 R. I- E0 o2 S! D0 G
  38.     Send(HexTable[dat>>4]);
    # x0 r7 q0 m0 B& C/ ?8 Z
  39.                 5 g2 h: g3 g- V6 D0 u
  40.     Send(HexTable[dat&0x0f]);  l: U; E  w) e% p( Q- K, G
  41.                 1 O; j7 Y- Q' @& M) `
  42.     Send(' ');7 {) h0 G6 [; x( O) O( |0 {. U7 b
  43. }9 @5 L, W4 ~; d# L* a# N" Z
  44. void UART1_sendstr(unsigned char *dat)
    ) ~$ f- a* T: O9 I4 N2 x
  45. {
    ) c. _7 m5 ~- k# O. Y
  46.     while(*dat!='\0')
    6 {/ j. N: b4 l- Q
  47.                
    7 g# n5 ^7 d4 F) _- e* v
  48.     {+ p# S* V5 A6 W% f2 Q; d5 p  j
  49.                                 ' }7 _% y; o/ B- O
  50.       Send(*dat);
    / a& ]' N1 `: C
  51.                                
    " q! R0 l9 U: @0 u9 W
  52.       dat++;
    8 ^0 y7 p0 p' f. ?% j- `5 A! D
  53.       //delay2us();# ~. x( w" p5 T# K
  54.                
    - U- d$ ]( L9 Q" }* j- a9 U/ r
  55.     }
    ) `5 h4 G+ W+ ~! X# d
  56. }6 n! ~/ W9 L0 v
  57. void main(void)
    : D) L' K8 Y& W' [& c' w
  58. {
    4 i* _/ }$ Z1 H. Z& V" q6 p- E; D
  59.     //FlagStatus flag_status;
    " N/ s* u, q& ]/ ^* p  v
  60.     u16 u16_adc1_value;
    & ]6 c5 E7 w5 d4 [. i6 H) J: C
  61.     //Init_UART1();
    & Q7 i7 D/ p6 _8 v* d
  62.     Init_ADC();
    6 `; z% D+ v/ F% p1 v. t  }. c
  63.    
    % e1 u8 u9 N) p( t+ V) N3 A
  64.     CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);//16/1=16MHZ4 W" B8 ^  `0 |5 p/ \& T
  65.     GPIO_DeInit(GPIOD);& x) k. _6 |% t6 k& c, }/ k
  66.     GPIO_Init(GPIOD,GPIO_PIN_2,GPIO_MODE_IN_PU_NO_IT);, I' Z1 A& O5 O  b( c
  67.     //GPIO_DeInit(GPIOD);
    6 _4 U. P3 n% m9 J& @
  68.     GPIO_Init(GPIOD,GPIO_PIN_4,GPIO_MODE_OUT_PP_HIGH_SLOW);
    4 p7 f/ o) B! |! A( H
  69.     3 G9 I6 T9 P- E% O
  70.     TIM2_Config();
    + ^- W" E* |( ^* E  C4 q% M  ~
  71.     TIM2_SetCompare1(CCR1_Val);" F& O6 Y8 W; q- y: E+ m
  72. /* Infinite loop */6 V- a/ f2 |+ V) `, B. B3 X% ~- }
  73.     while (1)4 x, P3 W1 b/ ?( d3 X7 C2 n3 ?5 y
  74.     {! N2 a! G* u7 T8 C0 T' E* Y
  75.                 //Send(0xf0);
    : b: b7 \: b3 \4 l" C6 m
  76.          ADC1_StartConversion();
    1 b; v1 W% ]7 R2 N' ?5 j7 R  g( i
  77.          //flag_status = ADC1_GetFlagStatus(ADC1_FLAG_EOC);
    8 w4 ~7 S$ Z3 \
  78.         // while(flag_status == RESET); // SET or RESET
    ( ~  X( m( ~' L+ E( k) l* \; M
  79.          while(RESET == ADC1_GetFlagStatus(ADC1_FLAG_EOC)); / o2 B2 Q* g- `5 O7 @7 {
  80.              u16_adc1_value = ADC1_GetConversionValue();! ~" }# E  J% t( `/ b; Z% C$ l
  81.          //CCR1_Val=u16_adc1_value*2/3-66;- D. O" _# x8 P- X5 }: p
  82.          //CCR1_Val=101+u16_adc1_value*10/19;
    2 c! G4 ?* Q. ]& S* s8 ]5 O
  83.          /*if(u16_adc1_value<180)! H( L$ \/ Z2 w$ X) }
  84.          {
    " K1 I, ~* u4 h7 P" Q! |
  85.             CCR1_Val=70+u16_adc1_value*2;0 W4 D" K" K6 ?$ X
  86.          }else9 v% R. C: ~% R, `0 {  P1 T1 E& H
  87.          {
    . i: o4 G+ }0 `; P2 J
  88.           CCR1_Val=460+(u16_adc1_value-180)*10/47;
      \. G8 p. c1 }; J% c- A* P1 i2 |
  89.          }2 s& l! {" M8 h0 U) a: G( A9 Z
  90.          */6 _) q. m& o8 a( Z# |
  91.           if(u16_adc1_value<180)  [2 d% b* B8 `5 A7 ?
  92.           {3 f+ f- e% K' r1 g5 G, J
  93.             if(u16_adc1_value<100){u16_adc1_value=100;}
    9 f( B% y& H2 u1 h: I: w( e
  94.             CCR1_Val=u16_adc1_value+((u16_adc1_value-100)*36/10);
    5 y) N" E# A4 }9 k" U
  95.           }else
    4 v2 B. D" Z+ b
  96.           {" L2 ~/ ^- d1 a4 M* k1 w* c3 B
  97.             CCR1_Val=460+(u16_adc1_value-180)*10/47;4 s6 s7 [. P& ?! b$ g) h
  98.           }
    ( _( m/ D6 S& K. C8 q/ ]7 e0 x
  99.            
    : ^% R& D, Y+ s' q$ U) ^% @
  100.          if(CCR1_Val>30000)
    6 F1 u; l6 M  J. U* h# s
  101.            CCR1_Val=0;% w: }  r$ J8 d# @) o+ B% p
  102.          if(CCR1_Val>PWM_F && CCR1_Val<2000)
    ! {& H6 H' z' h0 i0 F  k4 [+ A
  103.            CCR1_Val=PWM_F-2;
    9 t0 l7 V  B* G6 @0 Q5 e' }! t0 {+ m
  104.           TIM2_SetCompare1(CCR1_Val);
    : l* x8 {+ L  Q
  105.          //UART1_sendhex((u16_adc1_value>>8));- f- ~7 ^$ m; n% l6 D
  106.          //UART1_sendhex((u16_adc1_value&0xff));
    3 F! k, n' ?: w$ T
  107.          //UART1_sendstr("\r\n");7 v/ U2 M6 E! q( [5 H
  108.          
    , U- T6 r3 Z* k( m9 R
  109.          //GPIO_WriteReverse(GPIOB,GPIO_PIN_5);$ [& ^1 G2 N  D/ g6 v% W
  110.          
    # p# @3 r7 |+ B4 o! m1 C
  111.   }$ P7 ~( F( m* k5 \
  112.   5 {- }" n) z( F! u, z6 f( ?8 b
  113. }
    3 l$ c+ _% X$ C' G

  114. 8 R) m0 z9 A/ o* w7 x
  115. void TIM2_Config(void)
    ( Q/ \" z0 y3 b" K; c, W0 ]9 g3 b
  116. {& y3 M- Q/ ]* H  j2 H' W. |" N
  117. / E: n$ @( [3 F& V/ o9 a; J
  118.   TIM2_TimeBaseInit(TIM2_PRESCALER_1, PWM_F);
    * v3 P% I2 }4 p# b
  119. . o! n* g- _. Z0 |! f; H2 M
  120.   TIM2_OC1Init(TIM2_OCMODE_PWM1, TIM2_OUTPUTSTATE_ENABLE,CCR1_Val, TIM2_OCPOLARITY_HIGH);
    ; |2 e# M% O6 Y8 H- n) E% h
  121.   TIM2_OC1PreloadConfig(ENABLE);/ ]0 w  a' k0 i! H$ w9 l

  122. 7 ]6 |2 r( w5 I
  123. //  TIM2_OC2Init(TIM2_OCMODE_PWM1, TIM2_OUTPUTSTATE_ENABLE,CCR2_Val, TIM2_OCPOLARITY_HIGH);
    ) `6 B+ {0 S; v6 y0 ~
  124. //  TIM2_OC2PreloadConfig(ENABLE);
    6 a# ~6 u; P# Q3 M
  125.          
    & B8 D* \9 j) ?% K1 |* g
  126. //  TIM2_OC3Init(TIM2_OCMODE_PWM1, TIM2_OUTPUTSTATE_ENABLE,CCR3_Val, TIM2_OCPOLARITY_HIGH);
    % h7 |" u5 p( L9 u5 V: T' u5 U$ e8 Y
  127. //  TIM2_OC3PreloadConfig(ENABLE);1 N+ u& o6 U- x# t/ |
  128.   TIM2_ARRPreloadConfig(ENABLE);( v' f$ q. \' b7 }
  129. . @& B7 `, l7 {
  130.   TIM2_Cmd(ENABLE);
    : I- D% M0 B; V: u; v* j7 x0 W' i# ]
  131. }
    . o. c, R% C6 ?: L; D9 s
  132. # ?$ q* Q3 Y4 I( ]! [8 i' S2 U2 W
  133. void DelayApi(uint16_t uwDelayCnt)
    / o+ y: [0 `! L2 _0 u8 j
  134. {( E. v$ o# `" j/ m& a5 L0 v
  135.   while(uwDelayCnt--);
    5 }! ~# N7 S* i4 z7 k: @; l
  136. }" l3 a( O  O! ^) c" N2 |& c

  137.   b  I( ~; k0 Z4 M
  138. #ifdef USE_FULL_ASSERT
    1 [: t5 V+ s, T. _2 _$ q$ ^/ m

  139. " d1 i. @2 x5 n5 G
  140. /**
    * V1 y; q* O, ?2 w+ s
  141.   * @brief  Reports the name of the source file and the source line number, }: k( \+ b- o9 y4 P
  142.   *   where the assert_param error has occurred.
    ; ~% |- g+ p8 j  m# _6 T6 G+ |+ Q
  143.   * @param file: pointer to the source file name. j& H/ ~! d' p/ \2 O
  144.   * @param line: assert_param error line source number
    " C* {! M8 Y. s
  145.   * @retval : None6 n# P3 G4 t: z6 f
  146.   */  Y/ T5 U: x+ I$ H
  147. void assert_failed(u8* file, u32 line)
    4 T7 u9 U2 r6 \! t% E; N
  148. { 5 G) E" ]  ?* E9 a
  149.   /* User can add his own implementation to report the file name and line number,) @6 ?# E% p9 X1 y: d; |
  150.      ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */  j0 ?$ D' p" Q
  151. # t8 `& Z! N! C  c. e2 e7 J
  152.   /* Infinite loop */
    , q) ?9 e) ~$ H6 E
  153.   while (1)% e- @7 L$ f" s& x. e
  154.   {
    ( D9 h# G' j! A* p( T0 @
  155.   }
    2 ]- W& h4 C3 }$ C4 ^1 X
  156. }" v; O8 J/ H* m- {
  157. #endif
复制代码

1 m0 \2 M, U2 @/ P+ ]5 A
5 r- M& o" i$ t' K) R! V程序文件打包下载(IAR 包含原理图大图)
- S6 N- u0 r  ?链接:https://pan.baidu.com/s/1i5aShzn 密码:t8rc3 D+ \( C1 y; \+ T) @% @

评分

参与人数 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

8 [2 b2 Y1 Z  e1 ~2 K& n% F( y感谢分享
robter 回答时间:2018-10-25 08:03:11
很好的应用实例,学习了

所属标签

相似技术帖

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版