# 说明(已打板验证)
**免责声明:开源工程无法担责哈,无刷电机转的快,自己多测试,注意安全。**
用STC8G1K08A芯片(sop8封装)输出适用于无刷电调的PWM信号(芯片1.3元+电位器0.3元+阻容=2元)。(此芯片也有dip8封装,大概1.8元一个)
信号周期 2.56 毫秒,频率 390.625 Hz。
高电平时间默认 0.9-2.0 毫秒,步进2.5微秒。高电平时间范围可修改参数调整。
当电位器差不多位于前10%时输出0.9毫秒,差不多位于最后10%时,输出2.0毫秒,在10%-90%之间线性变化(见下面修改参数部分的配图)。同样可以修改代码调整。
*输出波形*
![sbq.jpg]

## 关于代码
代码是用sdcc编译的,不是keil。
考虑到有人要改参数,我给整了个自带sdcc的包,点一下就能编译,见附件。
### BugFix日志
2022/9/28:(电路)添加C2电容,以免电磁干扰引起电压波动,而错误的启动电机,提高稳定性。
2022/9/28:(代码)修正了错误的IO口配置,此错误将导致PWM输出口输出能力不足。
2022/9/27:(代码)修正了一个变量溢出的错误,此错误将导致输出不正确的占空比。
## 修改参数
通过网络可以了解到,控制无刷电调的模块输出的高电平信号是0.9-2.0毫秒。总的信号周期(高电平加低电平)一般在2毫秒到20毫秒之间,频率就是50Hz-500Hz。
首先,单片机在工作时,它所知道的信息是通过模数转化(ADC) 读取到电位器输出的电压值,这个数是10位精度,范围0-1023(2的10次方=1024)。
其次,单片机的输出是PWM信号,而电调只关心这个信号的高电平长度。高电平信号长度在1.0-2.0毫秒之间,也就是1000-2000微秒。
所以,给出6个参数可以配置的参数,(实际上是四个,剩下两个由这四个算出),(参数名字有点词不达意哈,随便取的,看配图就行)
```
PWM_HIGH_TIME_MIN,//输出高电平的最小长度,单位微秒
PWM_HIGH_TIME_MAX,//输出高电平的最大长度,单位微秒
PWM_HIGH_TIME_DLETA,//上面两个值的差
ADC_OFF_NUMBER,//当adc读到的值小于此值时,输出高电平取最小长度
ADC_ON_NUMBER,//当adc读到的值大于此值时,输出高电平取最大长度
ADC_ON_OFF_DELTA_NUMBER//上面两个值的差
```
由这六个参数(实际上是四个)所给出的输出pwm的高电平时间与adc读到的值(电位器的位置/电压)的关系如图所示:
![003.jpg]

所以修改这6个参数就可以了,那么在哪里改?
在一个名为 **config.h** 文件里改:
```c
#ifndef __CONFIG_H__
#define __CONFIG_H__
/****************************用户配置****************************/
/********* PWM *********/
#define PWM_HIGH_TIME_MIN 900
#define PWM_HIGH_TIME_MAX 2000 //800 < PWM_HIGH_TIME_MIN < PWM_HIGH_TIME_MAX < 2300,
#define PWM_HIGH_TIME_DLETA 1100 //PWM_HIGH_TIME_DLETA=PWM_HIGH_TIME_MAX-PWM_HIGH_TIME_MIN
/********* ADC *********/
#define ADC_OFF_NUMBER 100
#define ADC_ON_NUMBER 900 //30 < ADC_OFF_NUMBER < ADC_ON_NUMBER < 1000,
#define ADC_ON_OFF_DELTA_NUMBER 800 //ADC_ON_OFF_DELTA_NUMBER=ADC_ON_NUMBER-ADC_OFF_NUMBER
/******* PRINTF *******/
// 启用/禁用 串口打印,建议串口输出仅作为调试使用,在正常使用过程中当禁用
// 改成 0 以 禁用,改成 1 以 启用
#define IS_PRINTF_ENABLE 0 //禁止一直打印内容
/****** 上电休眠 ******/
// 单位 毫秒,范围 0-65535
#define ON_POWER_DELAY_TIME 300 //上电不立马启动,等稳定后再输出pwm
#endif
```
改完后大概保证下面四行关系成立就行。
```
800 < PWM_HIGH_TIME_MIN < PWM_HIGH_TIME_MAX < 2500,
PWM_HIGH_TIME_DLETA=PWM_HIGH_TIME_MAX-PWM_HIGH_TIME_MIN
30 < ADC_OFF_NUMBER < ADC_ON_NUMBER < 1000,
ADC_ON_OFF_DELTA_NUMBER=ADC_ON_NUMBER-ADC_OFF_NUMBER
```
### 下载选项
注意:IRC频率一定要选择 **12MHz**
**没有自动复位电路,点击下载后还需断开供电(推荐拔掉GND,再接上去),芯片重新上电后才开始下载**
![xiazai.jpg]

### 附件说明
①main.hex是固件。
②src.zip是源代码,适合自己能安装sdcc,会编译代码的同学。config.h就在目录里哈
③one_click_compile.zip是自带sdcc的源代码,点两下(不是one click哈)里面的build.bat他就帮你编译好main.hex。配置文件在one_click_compileinsrcconfig.h。
build.bat的输出差不多是这样的,看到main.hex就行。
![image.png]