集成两路MAX1169的STC8G1K08模块,带有两路PWM输出
■ 设计背景
在 集成有MAX1169,MAX520的DAAC单片STC8G1K08机电路板 中设计了集成有MAX1169的ADDA模块,对于一些需要使用PWM驱动的实验,这款模块还无法进行集成实验。
设计集成有两路MAX1169以及PWM输出的测试模块可以为很多实验提供测量和驱动功能。
比如:
01电路模块设计
1.电路设计1

▲ SCH原理图设计 

▲ PCB电路板和快速制版PCB的实验模块 
- 实验接口:(从右往左定义1,2,3,4~8)
| PIN1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 
|---|---|---|---|---|---|---|---|
| +5V | GND | AIN | AIN1 | AGND | PWM1 | IO | GND | 
2.单片机软件设计2
- OSC工作频率:35MHz, UART:460800bps
设置STC8G1K08的关于I2C以及PACKAGE_SOP8 的共定义。
#define PACKAGE_SOP8        1
#define USSD_EN             0
#define I2C_EN              1
#define SPI_EN              0
  
 - 1
- 2
- 3
- 4
(1) 软件说明
CCP2: 是PWM Channel3
(2) 串行命令
else IFARG0("maxstcpwm") {
    sscanf(SDA(1), "%d", &nNumber);
    PWM3SetPWM(0x3ff - nNumber);
} else IFARG0("maxstcread") {
    printf("%u %u\r\n", MAX1169Read(), MAX1169Read1());
} else IFARG0("maxstcreadb") {
    nNumber = MAX1169Read();
    SendChar((unsigned char)(nNumber >> 8));
    SendChar(nNumber);
    nNumber = MAX1169Read1();
    SendChar((unsigned char)(nNumber >> 8));
    SendChar(nNumber);
} else IFARG0("maxstcon") {
    ON(IO_PIN);
} else IFARG0("maxstcoff") {
    OFF(IO_PIN);
}
  
 - 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
02电路测试
1.PWM输出
- 输出管脚: 3
- PWM 频率:34.17kHz(示波器实测)
单片机工作频率: f o s c = 35 × 1 0 6 f_{osc} = 35 \times 10^6 fosc=35×106Hz,PWM的位数:10位。
 理论上计算PWM频率为:
f P W M = f o s c 2 10 = 35 × 1 0 6 1024 = 34.18 k H z f_{PWM} = {{f_{osc} } \over {2^{10} }} = {{35 \times 10^6 } \over {1024}} = 34.18kHz fPWM=210fosc=102435×106=34.18kHz
设置命令: maxstcpwm n
◎ 调试说明:
在STC8G1K08等单片机中,对于CCAP0H的赋值必须紧接着XCAP0H的赋值,所以对于其中的PWM1SetPWM函数需要进行修改:
//------------------------------------------------------------------------------
#if PWM_CHANNEL1_EN
void PWM1SetPWM(unsigned int nPWM) {
#if PWM1_BIT == 10
    unsigned char ucPWM, ucPCA;
    ucPWM = (unsigned char)(nPWM >> 4);
    ucPWM &= 0x30;
    ucPCA = PCA_PWM0
    ucPCA &= 0xcf;
    ucPCA |= ucPWM;
    PCA_PWM0 = ucPCA;    
#endif // PWM1_BIT
    CCAP0H = (unsigned char)(nPWM & 0xff);
                                            // CCAP0H:Must be assign value after XCAP0H
                                            // is valued.
}
#endif //  PWM_CHANNEL1_EN
//------------------------------------------------------------------------------
#if PWM_CHANNEL2_EN
void PWM2SetPWM(unsigned int nPWM) {
#if PWM2_BIT == 10
    unsigned char ucPWM, ucPCA;
    ucPWM = (unsigned char)(nPWM >> 4);
    ucPWM &= 0x30;
    ucPCA = PCA_PWM0
    ucPCA &= 0xcf;
    ucPCA |= ucPWM;
    PCA_PWM1 = ucPCA;    
#endif // PWM2_BIT
    CCAP1H = (unsigned char)(nPWM & 0xff);
}
#endif //  PWM_CHANNEL2_EN
//------------------------------------------------------------------------------
#if PWM_CHANNEL3_EN
void PWM3SetPWM(unsigned int nPWM) {
#if PWM3_BIT == 10
    unsigned char ucPWM, ucPCA;
    ucPWM = (unsigned char)(nPWM >> 4);
    ucPWM &= 0x30;
    ucPCA = PCA_PWM2;
    ucPCA &= 0xcf;
    ucPCA |= ucPWM;    
    PCA_PWM2 = ucPCA;
#endif // PWM3_BIT
    CCAP2H = (unsigned char)(nPWM & 0xff);
}
#endif //  PWM_CHANNEL3_EN
  
 - 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
2.IO输出
-  输出管脚:2
 设置命令:maxstcon, maxstcoff
3. 两路AD
-  对应管脚:PIN5,PIN6
 左边对应的: AD2
 右边对应的: AD1
03输入输出信号测试
1.对输出PWMRC滤波采集

▲ 对PWM输出RC滤波采集 
2.对于IO口的RC波形采集
- R= 10k, C = 100uF

▲ 对于IO口的RC波形进行采集 
使用scipy.optimize中的curve_fit函数对于上述采集数据进行指数拟合。
 得到的参数为:[-6.71239337e+04 -9.76200318e-01 6.87801729e+04]
 对应的表达式为:
  y ( t ) = 6.878 × 1 0 4 − 6.712 × 1 0 4 × e − ( t × 0.976 ) y\left( t \right) = 6.878 \times 10^4 - 6.712 \times 10^4 \times e^{ - \left( {t \times 0.976} \right)} y(t)=6.878×104−6.712×104×e−(t×0.976)
其中的时间常数 τ = 0.976 s \tau = 0.976s τ=0.976s
这与 R ⋅ C = 1 s R \cdot C = 1s R⋅C=1s很接近了。

▲ 进行数据拟合 
#!/usr/local/bin/python
# -*- coding: gbk -*-
#============================================================
# TEST2.PY                     -- by Dr. ZhuoQing 2020-07-23
#
# Note:
#============================================================
from headm import *
from scipy.optimize         import curve_fit
val = tspload('rcdata', 'val')
t = array(range(len(val))) * 0.01
def func(x, a, b, c):
    return a * exp(x*b) + c
param = [-10000, -0.1, 60000]
param, conv = curve_fit(func, t, val, p0=param)
printf(param)
fitval = func(t, *param)
#------------------------------------------------------------
plt.plot(t, val, label='measure')
plt.plot(t, fitval, label='fit')
plt.xlabel("Time(s)")
plt.ylabel("Output")
plt.grid(True)
plt.legend(loc='upper right')
plt.tight_layout()
plt.show()
#------------------------------------------------------------
#        END OF FILE : TEST2.PY
#============================================================
  
 - 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
※ 结论
基于两颗MAX1169构成了两路的16bitAD转换模块。通过STM8G1K08-SOP8的CCP2输出PWM波形。PWM的频率为34kHz,分辨率为10bi。
在调试过程,修改了原来STC8G单片机中的PWMnSetPWM()中的函数。对于PWMn的赋值与PWM_CCP的赋值按照满足STC8G1K08数据手册中的一看球。
文章来源: zhuoqing.blog.csdn.net,作者:卓晴,版权归原作者所有,如需转载,请联系作者。
原文链接:zhuoqing.blog.csdn.net/article/details/107532306
- 点赞
- 收藏
- 关注作者
 
             
           
评论(0)