MCC CSC214 Signal processing for astrophotography. 2018

Here is some of the work that we have done in a signal processing class CSC214 I was sitting in on during spring semester 2018, held at MCC, Rochester NY and instructed by D. Venable.

I helped with some of the software development for the creation of the first iteration of this class a long while ago, now years later it has been fully revamped.

The students now take hands on approach with both the hardware and software development. Unlike previews iterations where software was built by me and the instructor who originated the class and hardware was designed and built by the instructor. The old curriculum involved them experimenting and exploring this pre-built system, while in the new curriculum students are active part in all aspects of camera development, including embedded on camera and pc client software, case and mechanics design and building, circuit board layout and population, etc.

The new instructor was kind enough to let me sit in on the class and see how it has evolved. This has been a great chance for me to explore the hardware/electronics side of things more and of course I’m able to assist the students with some of the software components when needed.

The main role I took in the class was assisting my lab partner is programming the on camera control software that drove the CCD array chip and collected the image data from it. I was able to guide him through some of the nuances of low level programming in embedded C, CCD clocking, DAC and ADC etc.

In the end the class was successful in creating a working camera for Astrophotography, a rewarding experience for everyone involved.

And here is the test image taken with the camera at the conclusion of the class. Since work to complete the camera went late in to the night and there was low visbility due to cloud cover an image of a lab sign was taken with a telescope and the class camera setup inside the lab. Its not a nebula, but a thumbs up will do.

Test image taken with CSC214 camera


There were some issues with the shutter control / TEC cooling control board as such the camera had to run with no cooling and the shutter had to be driven manually, this can witnessed by all the noise in the test image above. Never the less it is a testament to the hard work of the class and the great guidance of the instructor that things could be made functional in the short time that the class schedule allowed, as project of this complexity is a very hefty task.

Astro - Camera client software csc214 218

Pictured above is the image retrieval PC client software written by another group of classmates, it was coded in C#.

OScope - spi com, and clocking

OScope - spi com, and clocking

OScope - spi com, and clocking

Some shots of the oscilloscope screen at various stages of development, mine and my partners task with in the greater project was writing the on board camera control software, these are just a few shots I took of testing the various code components with the Oscope. You can see some SPI data transmission, data and clocking, as well as some of the digital clocking signals that drive the external switch chips that in turn feed the analog clocking at appropriate voltages supplied by a DAC chip and some OPAmps to the CCD.

CSC214 S18 Lab Circuit built

And here is a proof of concept circuit of how the CCD will be driven, this was a lab project designed by the instructor that everyone had to complete. In this way everyone would get some familiarity with the digital signal processing aspect of the class at its most fundamental level.


Above are some pictures of a rapid prototype for a shutter suggestion I came up with, that was NOT used in the final camera design.

This is a code snipped that could have a wider use than just the specific camera created in the class so I figured I’d share it here. It implements a data collection loop from an emulated CCD Sensor with the option of horizontal and vertical binning along with the option for collecting a sub-frame from the array. This code was fitted in the class camera control software by simply creating the appropriate defines to drive the actual CCD.  Since this post is getting quite long already, I’ll keep the code shared confined to this example. If someone has interest in more of the camera control code created by my lab partner and me feel free to contact me and I’ll share what I’m able to.

// ============================================================
// CCD Sensor array data retrieval loop  
// with sub-frame and binning capability.
// Implemented with emulated sensor.
// by Hristo I. Gueorguiev 
// for CSC214 MCC Rochester, NY 2018
// ============================================================

#include <stdio.h>
#include <limits.h>

#define VERTICALSHIFT printf("\n");row--; col=COLS;
#define HORIZONTALSHIFT col--;
#define CDS1
#define CDS2
#define READFDVAL printf(" %d",TestImage[row][col]);

#define ROWS 20
#define COLS 20

int TestImage[ROWS][COLS];

int fillImage(void){
    for(int i=0; i<20; i++)
        for(int j=0; j<20; j++){
            TestImage[i][j] = i*100+j;

int main(void) {
    //TestImage array cursor variables (Remeove after TESTING)
    int row = ROWS;
    int col = COLS;
    //Image paramaters 
    int height = ROWS;
    int width = COLS;
    int xbin = 1;
    int ybin = 1;
    int xstart = 0;
    int ystart = 0;
	// Initilize test image array (Remeove after TESTING)
	//Align vertical positon for subframe 
	for(int i=0; i<ROWS-(ystart + height); i++) { VERTICALSHIFT }
	for(int i=0; i<COLS;i++) { HORIZONTALSHIFT } // Clear data from sensor shift register
	//Iterate frame to collect data 
	for(int i=0; i<(height/ybin)+(height%ybin)/(height%ybin); i++){
	    // VERTICAL SHIFT & Binning
	    for(int k=0; k<ybin -((ybin - height%ybin)* !((i-(height/ybin)) >> sizeof(int)*CHAR_BIT-1 )); k++) { VERTICALSHIFT }
        //Align horizontal positon for subframe 
    	for(int i=0; i<COLS-(xstart + width); i++) { HORIZONTALSHIFT }
	    for(int j=0; j<(width/xbin)+(width%xbin)/(width%xbin); j++){
	        // HORIZONTAL SHIFT & Binning
	        for(int k=0; k<xbin -((xbin - width%xbin)* !((j-(width/xbin)) >> sizeof(int)*CHAR_BIT-1)); k++) { HORIZONTALSHIFT }     
	return 0;

What is absolutely amazing about a class like this is that it touches on all aspects of product development in the field of digital electronics, software, hardware, enclosure design and mechanic, etc. All this presented by D. Venable and with helpful guidance by G. Fazekas two very experienced veterans in the industry. To get that kind of exposure to these processes and wealth of knowledge is invaluable at any level of the education process, not to mention at this early stage of academics.

This was a fun filled adventure in hardware and software design, I hope I was helpful to the students taking the class and a big thank you to D. Venable and G. Fazekas for allowing me to participate.